【问题标题】:Angular model looses scope with ng-included in directive [duplicate]Angular模型在指令中失去了ng-include的范围[重复]
【发布时间】:2014-12-26 23:46:24
【问题描述】:

我不确定如何正确命名这个问题,所以就这样吧..

我正在尝试使用 ng-include 方法设置一种动态方式来更改指令内的模板。我已经设置了两个 Plunker 示例,虽然一个应该像另一个一样工作,但似乎并非如此。

两个示例的 HTML:

<!DOCTYPE html>
<html ng-app="myApp">

  <head>
    <link rel="stylesheet" href="style.css">
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js"></script>
    <script src="script.js"></script>
  </head>

  <body>
    <main></main>
  </body>

</html>

示例 #1: http://plnkr.co/edit/bi3Plrm8xufuN79Nvajj?p=preview

我正在设置两个指令(一个是主指令,一个是嵌套的子指令):

angular.module('myApp', ['Test']);
angular.module('Test', [])
.directive('main', [
    function () {
        return {
            restrict: 'E',
            template: '<input type="text" ng-model="myModel"><br><br><child></child>'
        };
    }
])
.directive('child', [
    function () {
        return {
            restrict: 'E',
            template: '<input type="text" ng-model="myModel">'
        };
    }
]);

简单。运行应用程序时,两个字段会随着模型的变化而分别填充。

示例 #2: http://plnkr.co/edit/3ajcTyfJElEzbqvsWwBM?p=preview

HTML 保持不变,但 js 有点不同:

angular.module('myApp', ['Test']);
angular.module('Test', [])
.directive('main', [
    function () {
        return {
            restrict: 'E',
            template: '<input type="text" ng-model="myModel"><br><br><child></child>'
        };
    }
])
.directive('child', [
    function () {
        return {
            restrict: 'E',
            controller: function($scope) {
              $scope.myTemplate = 'test-template.html'
            },
            template: "<div ng-include='myTemplate'></div>"
        };
    }
]);

测试模板.html:

<input type="text" ng-model="myModel">

这一次,如果我与生成的第一个输入进行交互,则两个输入都会按应有的方式分别更新。这是它变得有趣的时候......当/如果我与第二个输入(由ng-include生成的那个)交互时,我会失去所有绑定。永远......几乎就像它创建了自己的模型版本一样。之后,更改第一个输入对第二个没有影响。

这里发生了什么?是否确实创建了myModel 的新实例?如果是这样,使用 ng-include 方法时如何避免这种情况?

【问题讨论】:

标签: javascript angularjs angularjs-directive angularjs-scope angularjs-ng-include


【解决方案1】:

这并不奇怪,正如 PSL 所说, ng-include 创建新范围。

如果您想创建使这些模型保持连接的行为, 你应该改变

&lt;input type="text" ng-model="myModel"&gt;

收件人:

&lt;input type="text" ng-model="$parent.myModel"&gt;

【讨论】:

  • 所以如果你还有 2 个子作用域包装你会做 $parent.$parent.$parent.myModel 吗?奇怪吗?
  • 是的,这很奇怪,但我无法想象您会想要创建 3 个嵌套的子范围。你有什么建议?
  • 你认为你的 html 结构总是很简单吗?可能有很多例子,但事实并非如此。如果您在 ng-repeat 中包含 ng-repeat 中的内容怎么办,这可能在 ng-if 中.. 只是说.. :) Point is $parent 是解决问题的最糟糕方法。
  • 绝对不是,但这就是为什么我要问你,最适合这种情况的解决方案是什么?
  • 查看我附加的链接和问题 cmets 上的 jsbin
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多