2016-07-09 3 views
1

Kann ich einige Zeichenfolgen in einem Objektliteral hinzufügen?Möglichkeiten, String-Hinzufügung in Objekt-Literal zu tun

Chrome gibt mir die folgende Fehlermeldung, wenn ich height: 'calc(100% - ' + String(this.padding) + 'px * 2)' mache.

[ProjectContainer.js:15] Uncaught TypeError: Cannot read property 'padding' of undefined

var styles = { 
    root: { 
     display: 'flex', 
     flexWrap: 'wrap', 
     textAlign: 'left', 
     padding: 10, 
     height: 'calc(100% - ' + String(this.padding) + 'px * 2)', 
     width: 'calc(100% - 10px * 2)', 
     overflowY: 'scroll' 
    } 
} 

Allerdings, wenn ich es als eine Funktion zu machen, wird keine Fehlermeldung angezeigt, aber die CSS-Arbeit scheint nicht. Dies kann der Fall sein, weil das Inline-Stil-System es nicht als eine Funktion sondern als Variable bezeichnet.

var styles = { 
    root: { 
     display: 'flex', 
     flexWrap: 'wrap', 
     textAlign: 'left', 
     padding: 10, 
     height: function() {return 'calc(100% - ' + String(this.padding) + 'px * 2)'}, 
     width: 'calc(100% - 10px * 2)', 
     overflowY: 'scroll' 
    } 
} 

Was ist der beste Weg, um die Höhe zu machen 'calc(100% - 10px * 2)' zu sein?

+0

Sie müssen sie festlegen, nachdem Sie das Objekt definiert wird, sind Sie nicht ein zu schaffen Beispiel hier. Also '' '' wird nichts halten. –

+0

@SpencerWieczorek - Er * erstellt * eine Instanz (von 'Object'). @CasperLi - hier gibt es kein JSON: JSON ist ein String-Format für den Datenaustausch. – nnnnnn

+0

@nnnnnn Sie können keine Instanz von etwas erstellen, bevor Sie sie definieren. Das Element wird nicht innerhalb von "root" erstellt, wenn Eigenschaften definiert werden. Es ist nachher, mit "hier" meine ich, wo sie versuchen "dieses" zu verwenden, vielleicht war mir das nicht klar. –

Antwort

4

in den Kommentaren erwähnt, Sie nicht this wörtliche zu Ihrem Objekt verweisen können, wie Sie es definieren. Stattdessen wird es sich auf den globalen this oder den this im aktuellen Umfang des Codes beziehen. Grundsätzlich können Sie die Eigenschaften eines Objekts verwenden wörtlichen, während Sie noch es definieren, müssen Sie so danach tun:

var styles = { 
 
    root: { 
 
     display: 'flex', 
 
     flexWrap: 'wrap', 
 
     textAlign: 'left', 
 
     padding: 10, 
 
     height: '',      // Optional 
 
     width: 'calc(100% - 10px * 2)', 
 
     overflowY: 'scroll' 
 
    } 
 
} 
 

 
styles.root.height = 'calc(100% - ' + String(styles.root.padding) + 'px * 2)'; 
 

 
console.log(styles);

+0

Beachten Sie, dass "Höhe" anfangs definiert ist, aber nicht notwendig ist. Wird 'styles.root.height' erstellt, wird eine' height' Eigenschaft erstellt, falls sie nicht existiert. –

1

können Sie versuchen, diese als

var styles = { 
    root: { 
     display: 'flex', 
     flexWrap: 'wrap', 
     textAlign: 'left', 
     padding: 10, 

     width: 'calc(100% - 10px * 2)', 
     overflowY: 'scroll' 
    }, 
    init: function() { 
     this.root.height = 'calc(100% - ' + String(this.root.padding) + 'px * 2)'; 
     delete this.init; 
     return this; 
    }, 
}.init() 
0

Sie nicht this innerhalb eines Objektliteral können einen richtig zu referenzieren während der Deklaration. this in JavaScript wird für den Funktionsumfang verwendet.

Das folgende Beispiel zeigt eine mögliche Lösung für Ihr Problem. Sie definieren padding grundsätzlich in einem Funktionsumfang und rufen sie in Ihrer Objekt-Literaldeklaration ab.

In most cases, the value of this is determined by how a function is called. It can't be set by assignment during execution, and it may be different each time the function is called. More info on this here .

function foo() { 
 
this.padding = 10; // declare it only once 
 

 
    var styles = { 
 
    root: { 
 
     display: 'flex', 
 
     flexWrap: 'wrap', 
 
     textAlign: 'left', 
 
     padding: this.padding, 
 
     height: 'calc(100% - ' + String(this.padding) + 'px * 2)', 
 
     width: 'calc(100% - 10px * 2)', 
 
     overflowY: 'scroll' 
 
    } 
 
    }; 
 

 
    console.log(styles.root); 
 

 
}; 
 

 
foo();

1

Sie könnten tun:

var styles = (function() { 
    var padding = '10'; 
    return { 
    root: { 
     display: 'flex', 
     flexWrap: 'wrap', 
     textAlign: 'left', 
     padding: +padding, 
     height: 'calc(100% - ' + padding + 'px * 2)', 
     width: 'calc(100% - 10px * 2)', 
     overflowY: 'scroll' 
    } 
})(); 

Dies macht den Einsatz von ein paar Spaß Javascript Techniken wie:

Dies hat den Vorteil, nicht nur getan, in einem einzigen Ausdruck, sondern auch leichter zu zwingen, ist zu lesen und zu verstehen.

und man kann es so ändern, dass die Polsterung Wert fast ohne neue Arbeit von außen weitergegeben werden konnte:

var styles = (function(padding) { 
    var padding = padding ? padding : '10'; 
    return { 
    root: { 
     display: 'flex', 
     flexWrap: 'wrap', 
     textAlign: 'left', 
     padding: +padding, 
     height: 'calc(100% - ' + padding + 'px * 2)', 
     width: 'calc(100% - 10px * 2)', 
     overflowY: 'scroll' 
    } 
})(padding); 
Verwandte Themen