Angularjs:2路绑定在包含的模板中不起作用

Cal*_*leb 16 angularjs

我想我在这里缺少一些简单(和重要)的东西.我正在使用一个包含模板的模板,该模板包含一个映射到某个值的输入:

<div ng-controller="Ctrl">
    <div ng-include src="'template.html'"></div>
</div>

<!-- template -->
<script type="text/ng-template" id="template.html">
    <input ng-model="testvalue" />
</script>
Run Code Online (Sandbox Code Playgroud)

控制器:

function Ctrl($scope) {    
   $scope.testvalue= "initial value";
}?
Run Code Online (Sandbox Code Playgroud)

警告$ scope.testvalue的值始终显示初始值,而不是更新的值(当您键入输入时).帮助我欧比万.你是我们唯一的希望.

小提琴:http://jsfiddle.net/h5aac/

dnc*_*253 31

这是绑定到基元而不是对象的常见问题.传递字符串的值而不是对象的引用.如果您使用对象而不是基元,它可以正常工作.你的范围内有类似的东西.

$scope.foo = {testvalue: "initial value"};
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/h5aac/2/

也:

在AngularJS中的transcluded指令中使用`ng-model`

ngRepeat中的指令时绑定问题

AngularJS - 使用异步响应更新范围值

我相信还有更多......

  • 我不会把它称为"虫子".这只是javascript对象和原语在传递时如何工作的问题.如果你设置为一个字符串的var并将它传递给一个函数,那么该函数可以随意改变它,并且它不会影响原始var的值.如果将var设置为一个对象,那么它就是一个传入的引用,并且在函数中对它进行的任何更改都将影响原始var引用的对象.希望这是有道理的. (4认同)

Mar*_*cok 7

在父作用域中引用对象属性的替代方法是使用$ parent访问父作用域中的基元:

<input ng-model="$parent.testvalue" />
Run Code Online (Sandbox Code Playgroud)

ng-include创建子范围.该范围原型继承自Ctrl的父范围.以下是3种变体的工作原理:

  • $ parent.testvalue将模型绑定到父作用域中的属性
  • testvalue本身将模型绑定到将在子范围上创建的新属性.此属性使用相同的名称"隐藏/隐藏"父作用域属性.
  • foo.testvalue(例如,参见@ dnc253的答案)也将模型绑定到父属性.它的工作方式如下:Javascript在子范围内没有看到/找到'foo',所以它在父范围中寻找它(由于原型继承)并在那里找到它.

要查看子范围的外观,请使用原始小提琴,并将此代码添加到模板中:

<a ng-click="showScope($event)">show scope</a>
Run Code Online (Sandbox Code Playgroud)

并将此代码添加到Ctrl:

$scope.showScope = function(e) {
   console.log(angular.element(e.srcElement).scope());
}
Run Code Online (Sandbox Code Playgroud)

在键入文本框之前,请单击"显示范围"链接.在控制台(我正在使用Chrome)中,您可以扩展"子"范围并看到它不包含testvalue属性(我觉得很惊讶,因为我不知道它是如何显示"初始值"的在文本框中).您可以展开$ parent,然后您将看到testvalue属性 - 此时,具有此名称的属性似乎仅在父作用域中.

现在,清除控制台,键入文本框,然后再次单击"显示范围"链接.您将看到"Child"范围现在具有新的testvalue属性.它会隐藏/隐藏父属性.因此,子作用域中的内容会看到子作用域testvalue属性,而父作用域中的内容会看到父作用域testvalue属性.

更新:仅供参考,我最近撰写了一篇关于范围原型继承的广泛答案/文章,更详细地解释了上述概念,并附有大量图片:AngularJS中范围原型/原型继承的细微差别是什么?