As you used @
here which need value from an attribute with {{}}
interpolation directive. And seems like directive is getting loaded first & then the vm.index
value is getting evaluated. So the changes are not occurring in current digest cycle. If you want those to be reflected you need to run digest cycle in safer way using $timeout.
$timeout(function(){
vm.index = parseInt(vm.index, 10)
})
Above thing is ensuring that value is converted to decimal value. The addition will occur on the on the directive html <h2>Item {{ vm.index + 1 }}</h2>
Working Demo
The possible reason behind this
As per @dsfq & my discussion we went through the angular $compile
API, & found that their is one method call initializeDirectiveBindings
which gets call only when we use controllerAs
in directive with an isolated scope. In this function there are switch cases for the various binding @
,=
and &
, so as you are using @
which means one way binding following switch case code gets called.
Code
case '@':
if (!optional && !hasOwnProperty.call(attrs, attrName)) {
destination[scopeName] = attrs[attrName] = void 0;
}
attrs.$observe(attrName, function(value) {
if (isString(value)) {
destination[scopeName] = value;
}
});
attrs.$$observers[attrName].$$scope = scope;
if (isString(attrs[attrName])) {
// If the attribute has been provided then we trigger an interpolation to ensure
// the value is there for use in the link fn
destination[scopeName] = $interpolate(attrs[attrName])(scope);
}
break;
In above code you can clear see that there they placed attrs.$observe
which is one sort of watcher which is generally used when value is with interpolation like in our case it is the same {{index}}
, this means that this $observe
gets evaluated when digest cycle run, That's why you need to put $timeout
while making index
value as decimal
.
The reason @dsfq answer works because he use =
provides two way binding which code is not putting watcher directly fetching value from the isolated scope, here is the code. So without digest cycle that value is getting updated.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…