我在玩指令的bindToController选项。我无意中发现,与孤立的范围相比,使用儿童范围的行为之间似乎有一个奇怪的区别。当我使用单独的作用域时,会为指令创建一个新的作用域,但是对绑定控制器属性的更改将被转发到父作用域。然而,当我使用子范围代替时,我的示例就会中断。(根据bindToController,应该允许使用子作用域的http://blog.thoughtram.io/angularjs/2015/01/02/exploring-angular-1.3-bindToController.html#improvements-in-14 )
守则:
{
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/
对名称的更改将转发给子作用域,但不会转发到父作用域。这与绑定到单独的作用域形成了对比。为什么会这样呢?
发布于 2015-10-06 18:17:34
这是因为您对两个控制器都使用了相同的别名(与注释中提到的object vs string值无关)。
您可能知道,controller as alias语法只是在作用域上创建一个alias属性,并将其设置为控制器实例。由于您在这两种情况下都使用vm作为别名(MainCtrl和FooDirCtrl),所以在正常的子范围中,您是在“隐藏”MainCtrl别名。(在这种情况下,"normal“意为”从父作用域继承的原型“)。因此,当您试图在新的作用域上计算vm.name (vm for MainCtrl)以获取“父值”时,它实际上是计算FooDirCtrl.name (这是未定义的),当您试图将其赋值回父范围时也是如此。
隔离作用域版本不受影响,因为该作用域不是从其父作用域继承的。
更新小提琴
更新:如果仔细查看源代码,这可能是一个错误(因为对非隔离作用域上的bindToController的支持是“追溯式”添加的)。我们似乎已经摆脱了这个bug,因为原型继承,但当名称碰撞,我们是运气不好。
我必须仔细检查它是否确实是一个bug,以及它是否“可修复”,但现在您可以通过为控制器使用不同的别名来解决这个问题(请参阅上面的“小提琴”)。
这就是为什么我不喜欢使用vm作为我的胶辊别名的原因(尽管流行的样式指南建议使用它) :)
让我们在angular.js#13021中跟踪这一点。
https://stackoverflow.com/questions/32972354
复制相似问题