从ng-include访问和修改$ scope

时间:2014-06-16 22:33:37

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

修改 我只是意识到为什么它可能不起作用,虽然我不知道如何解决这个问题。包含在我的主HTML页面上,而不在我的ng-view中。这可能是为什么$ parent不起作用的原因,因为从技术上讲,ng-view是include的父级。所以它是:

<body>
 <div ng-view></div>
 <div ng-include="menuPath"></div>
</body>

我需要从ng-include范围访问ng-view范围。

我已经创建了一个用来说明问题的傻瓜 http://plnkr.co/WtVdkWKXaPWCfHJPLf1q

原始问题

由于我无法控制的限制,我必须使用ng-include包含每个页面的所有菜单。我试图弄清楚如何从ng-include访问和修改父作用域。我发现了几个关于它的线索,但是这些例子都没了。看起来它很简单,但我似乎无法找到答案。

例如,在我的主页上,我在Scope

中有以下数据
{
  "Statuses":
  [
    {"ID":"1", "Name":"Open"},
    {"ID":"2", "Name":"Closed"}
  ],
  "StatusID":"1"
}

在我的ng-include中,我尝试执行以下操作:

<select ng-model="StatusID" ng-options="x.ID as x.Name for x in Statuses"></select>

虽然ng-include显然创建了自己的范围,但它并没有获得数据。

2 个答案:

答案 0 :(得分:3)

您可以将数据存储在服务中,因为它们是单例并且可以跨控制器共享。像这样:

app.factory('MenuCache', function() {

    var data = {
     };  // your data;

    return data;

});

然后它可以注入你的控制器,因此你不必担心他们的祖先:

app.controller('MyCtrl', function($scope, MenuCache) {

});

**或者,作为对更新的问题的回答**

您可以在include上执行此操作(请参阅$ parent.StatusID)以访问父作用域的StatusID。

<select ng-model="$parent.StatusID" ng-options="x.ID as x.Name for x in a.Statuses">

演示:http://plnkr.co/edit/eZUnmZAWobFmw52B3IWh?p=preview

答案 1 :(得分:3)

ng-include是将创建子范围的指令之一。由于它依赖于范围继承来解析绑定,因此ng-model应该具有'。'。在其中妥善解决。否则,当通过更改下拉列表设置StatusID时,它将在子作用域上创建一个阴影变量,该作用域是父作用域中变量的副本。这打破了模型绑定。

您需要设置如下内容:

<select ng-model="model.StatusID" 
     ng-options="x.ID as x.Name for x in model.Statuses"></select>

在父范围中定义model的位置。这可确保当“选择”列表更改时,它会更新正确的模型。

在您的父控制器中:

app.controller('parentCtrl', function($scope) {
     $scope.model = {
        "Statuses":
         [
             {"ID":"1", "Name":"Open"},
             {"ID":"2", "Name":"Closed"}
         ],
         "StatusID":"1"
    }
});