我正在玩指令的bindToController
选项。我偶然发现了使用子范围的行为与孤立范围之间的看似奇怪的区别。当我使用隔离的作用域时,将为该指令创建一个新的作用域,但对绑定的控制器属性的更改将转发到父作用域。然而,当我使用一个子范围,而我的例子中断。 (使用bindToController
使用童工范围应根据http://blog.thoughtram.io/angularjs/2015/01/02/exploring-angular-1.3-bindToController.html#improvements-in-14被允许)儿童范围内的行为bindToController与隔离范围
代码:
{
restrict: 'E',
scope: {},
controller: 'FooDirCtrl',
controllerAs: 'vm',
bindToController: {
name: '='
},
template: '<div><input ng-model="vm.name"></div>'
};
工作演示https://jsfiddle.net/tthtznn2/
使用儿童范围的版本:
{
restrict: 'E',
scope: true,
controller: 'FooDirCtrl',
controllerAs: 'vm',
bindToController: {
name: '='
},
template: '<div><input ng-model="vm.name"></div>'
};
演示: http://jsfiddle.net/ydLd1e00/
对名称的更改被转发到子作用域,但不转发到父作用域。这与绑定到一个孤立的范围相反。为什么是这样?
因为vm.name是字符串和JavaScript传值?可能会再创建一个像vm.data.name这样的嵌套对象并绑定数据。 – YOU
实际上,在后一种情况下绑定到一个对象(请参阅:http://jsfiddle.net/sbvm1nd4/)。尽管如此,我仍然不明白孤立子域与子域之间为什么会有所不同,但我希望孤立域也会遇到同样的问题。 –
其原型继承的JavaScript性质 - https://github.com/angular/angular.js/wiki/Understanding-Scopes,我个人认为角度可以改变这种行为是一致的,因为所有的表达式都是通过角度的AST来分析的,但是可能是他们选择遵循javascript的本质。 – YOU