修改 我只是意识到为什么它可能不起作用,虽然我不知道如何解决这个问题。包含在我的主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显然创建了自己的范围,但它并没有获得数据。
答案 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">
答案 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"
}
});