2013-03-23 70 views

回答

83

这是一个范围内的继承问题,由于ng-switch创建其自己的范围。

经常提出的一个建议是在模型上始终使用dot。原因在于,当控制器作用域项目是对象而不是基元时,子作用域将创建对初始对象的引用。如果模型是原始的,它将不会更新原始模型。

例如:

<input ng-model="test.value" placeholder="pre" type="text" /> 
$scope.test={value:''} 

另一种方法是使用$parent在HTML模型标记:

<input ng-model="$parent.test" placeholder="pre" type="text" /> 

使用dot方法是一个很好的做法,以避免这些问题,你不不需要考虑更深的嵌套范围。

使用test.value为模型演示:http://plnkr.co/edit/CkiF55bLXsYzR6ZjcrJp?p=preview

关于模型dot引用(读宝贵):https://github.com/angular/angular.js/wiki/Understanding-Scopes

+0

任何理由这种行为?我花了三个小时试图找出它,因为我改变了手动显示/隐藏我的两个相同数据的视图到ng-switch3天和3个源代码控制版本之前,一切似乎都正常。我有一个select来为列表中选择的内容设置当前字符,并且该字符有一个任务列表。一切看起来都可以找到,但是当我点击我任务上的按钮时,它正在使用原始父字符。任何方式来访问点击方法中的子范围(我使用executeTask($索引))? – 2013-05-29 04:30:52

9

这是因为你实际上创建NG-开关内部的子范围。因此,属于ngSwitch指令的作用域上存在另一个test属性。它最初将显示来自其父范围的值,但是当您编辑它时,由于它是原始的,它只会编辑子项上的值,而不是父项。原型继承在这里不起作用(但这就是我们需要的)。

当您单击该按钮时,该按钮正在alerting/console.logging父范围上的属性...子项无法更改。

为了解决这个问题使用$parent.test在你ngSwitch您的NG-模型属性:

一个片段:

<span class="pew" ng-switch-when="title2"> 
    <input ng-model="$parent.test" placeholder="pre" type="text" /> 
    {{test}} 
</span> 

And here's a fork of your plunker showing it in action.

3

我遇到类似的问题,我已经通过在控制器创建一个范围变量求解并用于ng-includeng-switch。这样,如果你深嵌ng-includeng-switch并继续,我们仍然可以直接使用该范围变量。

由于所有子作用域(在这里,ng-include/ng-switch)从父范围(通常,控制器范围)延伸,我们可以在这些子作用域访问父范围直接没有问题。

使用$parent需要写这样$parent.$parent.$parent.someProp

例普拉克:http://plnkr.co/edit/8UGH7nUpFmATiXfkYSwr?p=preview

相关问题