2013-08-08 12 views
21

Ricordo di aver visto questa famosa citazione da un video su AngularJS che diceva che dovrebbe sempre essere usato a. (punto) nei tuoi modelli.Se non si utilizza un punto (punto) nei modelli AngularJS, si sta sbagliando?

Beh, io sto cercando di seguire questa dire che ho

var item = {} 
    item.title = "Easy Access to support"; 
    item.available = true; 
    item.price = 31.67; 

Quindi questo funziona alla grande, a mio avviso faccio

{{ item.title }} 
    {{ item.available }} 

Sto usando un puntino quindi penso che questo è buono.

Ma ho alcune proprietà che non considero parte della modella ma forse ho torto. Ad esempio, ho una proprietà che uso per abilitare o disabilitare un pulsante usando il ng-disable, ho inserito questo usando il formato punto. La sua sostanza è entrato in questo modo

$scope.disableButton = true; 

e lo uso come

ng-disable="disableButton"...... 

Devo fare questa parte del modello "voce"? o creare un altro oggetto js solo così posso mantenere questa proprietà usando un punto?

Qualcuno sa se questo è accettabile o dovrei fare tutto (anche queste semplici proprietà) con un .dot ??

Grazie

+3

Ecco il punto esatto nel video in cui Miško menziona che hai bisogno di un "punto" con ng-model: http://www.youtube.com/watch?v=ZhfUv0spHCY&feature=youtu.be&t=32m51s –

+0

Un luogo in cui il "use a dot" fall è se la direttiva prende un ngModel ma avvolge altre direttive e passa ngModel alle altre direttive. La notazione punti viene persa non appena si verifica il primo passaggio, perché la variabile viene rinominata in "ngModel" (o qualsiasi altro alias impostato) non appena passa alla prima direttiva. Da lì in poi, è noto come "ngModel" che è assente dalla notazione dei punti e viene trattato come una primitiva, che influisce sulla sua capacità di essere passato più in basso lungo la catena direttiva nidificata –

risposta

41

Il "ci dovrebbe sempre essere un punto nel modello" si riferisce alla ngModel. Questa direttiva è vincolante a doppio senso. Se si esegue il binding bidirezionale su una primitiva (ad esempio un booleano nel proprio caso), il setter lo imposterà sull'ambito corrente anziché sull'ambito su cui è definito, il che può causare un mal di testa quando si ha un utente di grandi dimensioni- interfaccia con molti ambiti figlio. Non fa riferimento ad altre direttive come ngDisable. Vedere this explanation per ulteriori dettagli su questo problema specifico.

Esempio di scenario: un ambito padre con $scope.foo = "bar" e un ambito figlio con un <input type="text" data-ng-model="foo">. Visualizzerà inizialmente bar, ma una volta che l'utente ha modificato il valore, verrà creato uno foo sull'ambito figlio e il binding leggerà e scriverà quel valore. Il numero foo del genitore rimarrà bar. Spero che lo riassuma bene.

Quindi, per gli scopi di ngModel, potrebbe essere necessario creare un oggetto per aggirare tali problemi di associazione, ma per qualsiasi altra direttiva è necessario disporre del raggruppamento logico regolare.

+1

Questa è stata una grande spiegazione, grazie. – Martin

+2

La sintassi 'controllerAs' funziona alla grande per questo scopo (e in generale per evitare confusione nell'oscilloscopio). – GBa

+1

La spiegazione più chiara e sintetica che ho visto per questo. –

Problemi correlati