2016-12-21 2 views
3

Ich kann nicht verstehen, warum die Variable in der Richtlinie Controller nicht definiert ist:Warum sind Variablen im Direktiven-Controller nicht definiert?

'use strict'; 
 

 
angular 
 
    .module('app', []) 
 
    .directive('myExample', myExample, ['$scope']); 
 

 
function myExample() { 
 
    var directive = { 
 
     restrict: 'E', 
 
     template: '<span>{{vm.date}}</span>', 
 
     scope: {}, 
 
     controller: ExampleController, 
 
     controllerAs: 'vm', 
 
     bindToController: { 
 
      date: '@' 
 
     } 
 
    }; 
 

 
    return directive; 
 
} 
 

 
function ExampleController($scope) { 
 
    var vm = this; 
 

 
    // I need here some code with vm.date 
 
    // BUT vm.date is undefined 
 
    // Why? 
 
    console.log('Ctrl: %s', vm.date); 
 

 
    $scope.$watch('vm.date', function (newValue, oldValue) { 
 
     // vm.date is 777 
 
     console.log('Ctrl: %s | %s', oldValue, newValue); 
 
    }); 
 
}
<body ng-app="app"> 
 
    <my-example date="777"></my-example> 
 

 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.0/angular.min.js"></script> 
 
</body>

Warum ist vm.date nicht definiert? Wie man das macht, dass es definiert wurde?

Ich habe versucht, die gleiche Methode mit link zu verwenden. Kein Problem.

Antwort

5

Da die Bindung ist nicht in dem Moment, als ExampleController konstruiert ist. Seit v1.6 müssen Sie $onInit verwenden:

function ExampleController($scope) { 
    var vm = this; 

    this.$onInit = function() { 
    console.log('Ctrl: %s', vm.date); 
    } 
} 

Und entfernen $scope, Sie brauchen es gar nicht (vermeiden Sie es).

Alternativ können Sie altes Bindungsverhalten mit preAssignBindingsEnabled Einstellung von $compileProvider reaktivieren:

.config(function($compileProvider) { 
    $compileProvider.preAssignBindingsEnabled(true); 
}); 

aber besser Schalter auf $onInit Option, da dies ist, wie es von jetzt an wird (und wie ist es in Angular 2) .

+0

Ich benutze $ Scope für Tests. Danke für die Hilfe! Es funktioniert mit '$ onInit'. Ich denke 'vm. $ OnInit' ist schöner. – raciasolvo

Verwandte Themen