首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子范围中的行为bindToController与孤立作用域中的行为

子范围中的行为bindToController与孤立作用域中的行为
EN

Stack Overflow用户
提问于 2015-10-06 14:19:17
回答 1查看 1.8K关注 0票数 5

我在玩指令的bindToController选项。我无意中发现,与孤立的范围相比,使用儿童范围的行为之间似乎有一个奇怪的区别。当我使用单独的作用域时,会为指令创建一个新的作用域,但是对绑定控制器属性的更改将被转发到父作用域。然而,当我使用子范围代替时,我的示例就会中断。(根据bindToController,应该允许使用子作用域的http://blog.thoughtram.io/angularjs/2015/01/02/exploring-angular-1.3-bindToController.html#improvements-in-14 )

守则:

代码语言:javascript
复制
{
    restrict: 'E',
    scope: {},
    controller: 'FooDirCtrl',
    controllerAs: 'vm',
    bindToController: {
        name: '='
    },
    template: '<div><input ng-model="vm.name"></div>'
};

工作演示https://jsfiddle.net/tthtznn2/

使用子范围的版本:

代码语言:javascript
复制
{
    restrict: 'E',
    scope: true,
    controller: 'FooDirCtrl',
    controllerAs: 'vm',
    bindToController: {
        name: '='
    },
    template: '<div><input ng-model="vm.name"></div>'
};

演示:http://jsfiddle.net/ydLd1e00/

对名称的更改将转发给子作用域,但不会转发到父作用域。这与绑定到单独的作用域形成了对比。为什么会这样呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-06 18:17:34

这是因为您对两个控制器都使用了相同的别名(与注释中提到的object vs string值无关)。

您可能知道,controller as alias语法只是在作用域上创建一个alias属性,并将其设置为控制器实例。由于您在这两种情况下都使用vm作为别名(MainCtrlFooDirCtrl),所以在正常的子范围中,您是在“隐藏”MainCtrl别名。(在这种情况下,"normal“意为”从父作用域继承的原型“)。因此,当您试图在新的作用域上计算vm.name (vm for MainCtrl)以获取“父值”时,它实际上是计算FooDirCtrl.name (这是未定义的),当您试图将其赋值回父范围时也是如此。

隔离作用域版本不受影响,因为该作用域不是从其父作用域继承的。

更新小提琴

更新:如果仔细查看源代码,这可能是一个错误(因为对非隔离作用域上的bindToController的支持是“追溯式”添加的)。我们似乎已经摆脱了这个bug,因为原型继承,但当名称碰撞,我们是运气不好。

我必须仔细检查它是否确实是一个bug,以及它是否“可修复”,但现在您可以通过为控制器使用不同的别名来解决这个问题(请参阅上面的“小提琴”)。

这就是为什么我不喜欢使用vm作为我的胶辊别名的原因(尽管流行的样式指南建议使用它) :)

让我们在angular.js#13021中跟踪这一点。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32972354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档