我为此搜索并尝试了很多东西,我想也许我只是做错了。
我有一个单页面应用程序,它具有非常相似的DOM部分,仅通过从服务提供给它们的数据来区分。每个DOM部分都有不同的Web服务。
我的HTML看起来像这样
<div section="foo">
<ul>
<li ng-repeat="item in collection">{{item.name}}</li>
</ul>
</div>
<div section="bar">
<ul>
<li ng-repeat="item in collection">{{item.cost}}</li>
</ul>
</div>
在我的真实例子中,差异更为显着,所以我不能仅仅将“成本”改为“名称”并让它们相同。
我的指令看起来像这样:
angular.module("App").directive("section", ["BaseProvider", function(provider) {
return {
restrict: "A",
scope: {},
link: function($scope, element, attrs) {
provider.query(attrs.section).success(function(response) {
$scope.collection = response; // ** pay attention to this line **
});
}
};
}]);
所以,它调用BaseProvider的查询方法,传入DOM元素的section属性。所以,在我的例子中,“foo”或“bar”。
BaseProvider看起来像这样:
angular.module("App").factory("BaseProvider", ["$http", function($http) {
var urls = {
foo: "/something/foo.v1.json",
bar: "/something/bar.v2.json"
};
return {
query: function(base) {
return $http.get(urls[base]);
}
};
}]);
这一切都有效。我正在运行的是典型的指令问题 - 它没有及时到达$apply
/ $digest
周期,因此当我在指令内部执行$scope.collection = response
时,集合已设置,但DOM不会更新。
所以,我尝试运行$scope.$apply()
,但后来我遇到$ digest in progress错误。
http://docs.angularjs.org/error/$rootScope:inprog?p0=$digest
我已经尝试了这些建议,但我仍然遇到了问题。我现在已经没有想法了,也许我希望有一个可重复使用的指令和一个推动整个事情的单一提供者是不可能的。
我使用FooCtrl和BarCtrl进行了这一切,但我重复了很多次,感觉不对。
答案 0 :(得分:6)
如果您使用的是角度1.2.x或更高版本,则指令将无效,因为它使用的是隔离范围。隔离范围意味着您分配给范围的任何变量只能在范围的内部模板中使用(意味着使用template:
属性在指令中定义的模板。
由于您的指令没有模板,因此不应使用隔离范围。而不是做:
scope: {}
你应该这样做:
scope: true
这将使指令创建范围但不隔离它。这将使您的指令范围可用于外部模板(即您的ng-repeat)。
请记住这一点,如果您的指令中没有定义模板,则几乎不应使用隔离范围。