问题
So I have a directive with isolate scope and a controllerAs pattern.
var directive = {
restrict: 'E',
scope: {
something: '='
},
templateUrl: './App/directiveTemplate.html',
controller: directiveController,
controllerAs: 'vm',
bindToController: true
}
and in the controller I init with a call to a REST service using $http that returns a promise.
function directiveController(someService) {
var vm = this;
// Here vm.something is defined and bound to the appropriate model set where the directive is used
init()
function init() {
return someService.getProducts()
.then(productsReady);
function productsReady(response) {
vm.products = response;
//find product using vm.something
// here vm.something is undefined
return vm.products;
}
}
The problem is that if I breakpoint before the init()
method vm.something
is defined like it should be but in the productsReady
function it is undefined.
Is that a normal behaviour? Is the promise resolving code in a different scope?
回答1:
Use the $onInit Life-Cycle Hook to guarantee the timing of bindings:
function directiveController(someService) {
var vm = this;
̶i̶n̶i̶t̶(̶)̶
this.$onInit = init;
function init() {
return someService.getProducts()
.then(productsReady);
function productsReady(data) {
vm.products = data;
return vm.products;
}
}
From the Docs:
Initialization logic that relies on bindings being present should be put in the controller's
$onInit()
method, which is guaranteed to always be called after the bindings have been assigned..component('myComponent', { bindings: {value: '<'}, controller: function() { this.$onInit = function() { // `this.value` will always be initialized, // regardless of the value of `preAssignBindingsEnabled`. this.doubleValue = this.value * 2; }; } })
— AngularJS Developer Guide - Migrating to V1.6 - $compile
来源:https://stackoverflow.com/questions/46568520/bindings-on-directive-with-isolate-scope-not-in-scope-sometimes