Jan*_*ing 5 angularjs angularjs-directive angularjs-scope
我正在玩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>'
};
Run Code Online (Sandbox Code Playgroud)
工作演示https://jsfiddle.net/tthtznn2/
使用子范围的版本:
{
restrict: 'E',
scope: true,
controller: 'FooDirCtrl',
controllerAs: 'vm',
bindToController: {
name: '='
},
template: '<div><input ng-model="vm.name"></div>'
};
Run Code Online (Sandbox Code Playgroud)
演示:http://jsfiddle.net/ydLd1e00/
对name的更改将转发到子作用域,但不会转发到父作用域.这与绑定到隔离范围形成对比.为什么是这样?
这是因为您对两个控制器使用相同的别名(并且与注释中提到的对象与字符串值无关)。
您可能知道,controller as alias语法只是alias在范围上创建一个属性并将其设置为控制器实例。由于您在两种情况下都用作vm别名(MainCtrl和),因此您在正常子作用域的情况下FooDirCtrl“隐藏”了别名。(在这种情况下,“正常”意味着“原型地从父作用域继承”。)因此,当您尝试在新作用域上求值(for )以获取“父值”时,它实际上是在求值(未定义)当您尝试分配回父作用域时,也会发生同样的情况。MainCtrlvm.namevmMainCtrlFooDirCtrl.name
隔离作用域版本不受影响,因为该作用域不是从其父作用域继承的。
更新:
仔细查看源代码,这可能是一个错误(因为支持bindToController非隔离范围的支持是“追溯”添加的)。由于原型继承,我们似乎已经摆脱了这个错误,但是当名称冲突时我们就不走运了。
我必须仔细检查以确保它是否确实是一个错误以及是否“可修复”,但现在您可以通过为控制器使用不同的别名来解决它(请参阅上面的小提琴)。
这就是(部分)为什么我不喜欢使用vm作为我的控制器别名(尽管流行的风格指南建议这样做):)
让我们在angular.js#13021中跟踪这一点。
| 归档时间: |
|
| 查看次数: |
1702 次 |
| 最近记录: |