angularjs - ng-switch不绑定ng-model

时间:2013-03-23 23:30:39

标签: angularjs ng-switch

我有这个repro http://embed.plnkr.co/nVCmukG5abpi1Y4ZHkrq,当我点击'Title3'并在文本框中输入一个值时虽然输入的值显示在UI中反映,当我点击'click'按钮时没有任何绑定范围属性$ scope.test。

我不知道ng-switch有什么问题,或者我做错了什么。感谢帮助!!!

http://embed.plnkr.co/nVCmukG5abpi1Y4ZHkrq

3 个答案:

答案 0 :(得分:85)

这是范围继承问题,因为ng-switch创建了自己的范围。

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

例如:

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

另一种方法是在html模型标记中使用$parent

<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

答案 1 :(得分:10)

这是因为你实际上是在ng-switch中创建了一个子范围。因此,属于ngSwitch指令的作用域上存在另一个test属性。它最初将显示其父作用域的值,但是当您编辑它时,因为它是基元,它只编辑子项的值,而不是父项。原型继承在这里没有发挥作用(但这就是我们需要的)。

当您单击按钮时,按钮正在警告/ console.logging父范围内的属性...孩子无法更改。

要修复此问题,请在ngSwitch中的ng-model属性中使用$parent.test

一个片段:

<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.

答案 2 :(得分:4)

我遇到过类似的问题,我通过在控制器中创建一个范围变量并在ng-includeng-switch中使用它来解决。这样,如果你在ng-include中嵌套了ng-switch,并且它继续,我们仍然可以直接使用该范围变量。

由于所有子范围(此处,ng-include / ng-switch)都从父范围(通常是控制器范围)扩展,我们可以直接访问父范围。子范围没有问题。

使用$parent需要写为$parent.$parent.$parent.someProp

示例Plunk: http://plnkr.co/edit/8UGH7nUpFmATiXfkYSwr?p=preview