我有这个repro http://embed.plnkr.co/nVCmukG5abpi1Y4ZHkrq,当我点击'Title3'并在文本框中输入一个值时虽然输入的值显示在UI中反映,当我点击'click'按钮时没有任何绑定范围属性$ scope.test。
我不知道ng-switch有什么问题,或者我做错了什么。感谢帮助!!!
答案 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>
答案 2 :(得分:4)
我遇到过类似的问题,我通过在控制器中创建一个范围变量并在ng-include
和ng-switch
中使用它来解决。这样,如果你在ng-include
中嵌套了ng-switch
,并且它继续,我们仍然可以直接使用该范围变量。
由于所有子范围(此处,ng-include
/ ng-switch
)都从父范围(通常是控制器范围)扩展,我们可以直接访问父范围。子范围没有问题。
使用$parent
需要写为$parent.$parent.$parent.someProp
示例Plunk: http://plnkr.co/edit/8UGH7nUpFmATiXfkYSwr?p=preview