2015-08-14 11 views
14

Utilizzando $scope è facile emettere un evento o guardarne uno.

(function() { 
    "use strict"; 

    angular 
     .module("app") 
     .controller("Ctrl", [ 
      "$scope", 
      CtrlDefinition 
     ]); 

    function CtrlDefinition($scope) { 
     $scope.$on("change", listenForChange); 

     function listenForChange(data) { 
      //do something 
     } 
    } 
})(); 

Ma se provo ad usare la sintassi var vm = this, che sto avvertito che $on, $emit, e $broadcast non sono metodi di this. Come posso accedervi? Devo ancora iniettare $scope nella definizione del controller?

(function() { 
    "use strict"; 

    angular 
     .module("app") 
     .controller("Ctrl", CtrlDefinition); 

    function CtrlDefinition() { 
     var vm = this; 
     vm.$on("change", listenForChange); //$on is not a method of vm 
    } 

})(); 

Si potrebbe fare qualcosa di simile, ma non sarebbe sconfiggere lo scopo di non dover utilizzare $scope a tutti?

(function() { 
    "use strict"; 

    angular 
     .module("app") 
     .controller("Ctrl", [ 
      "$scope", 
      CtrlDefinition 
     ]); 

    function CtrlDefinition($scope) { 
     var vm = this; 
     vm.scope = $scope; 
     vm.scope.$on("change", listenForChange); 
    } 

})(); 

Come si può accedere agli osservatori con il controller come sintassi?

risposta

20

Per utilizzare tutto ciò che esiste su $scope, è necessario iniettare $scope. È sfortunatamente così semplice, che è una lacuna della sintassi "come".

La buona notizia, tuttavia, è che l'iniezione di $scope fianco this non cambia il modo il controller come funzioni di sintassi, dà semplicemente di accedere a tutta la gestione degli eventi che vive $scope.

Vale la pena notare che questo è uno dei motivi principali di ciò che sta arrivando in Angular 2.0 ... c'è un vero problema e discrepanza tra $scope e la sintassi "Controller come" che è stata imbullonata per risolvere i problemi dell'ambito in visualizzazioni.

+0

Vedo ... Non sono molto fluente nella differenza tra '$ scope' e' this', anche se il tuo commento mi tenta solo di usare 'var vm = $ scope'. –

+1

'this' è una parola chiave riservata in javascript che fa riferimento all'ambito immediato (in questo caso, la funzione' CtrlDefinition'. Sebbene si possa fare ciò, si potrebbero anche esporre i dati che non sono rilevanti per il controller, motivo per cui la migliore pratica detta 'var vm = this;'. –

+0

@DanielLizik Non userei assolutamente '' '' vm = $ scope''' per collegare semplicemente tutto dal controller a $ scope, che vanifica completamente lo scopo dell'utilizzo vm o $ ctrl. – shwnrgr

Problemi correlati