Javascript 带有$http请求的AngularJS指令(inprog错误)
我已经为此搜索和尝试了很多东西,我想也许我只是做错了 我有一个单页应用程序,它有非常相似的DOM片段,只有从服务中输入的数据才有区别。每个DOM片段都有一个不同的web服务 我的HTML看起来像这样Javascript 带有$http请求的AngularJS指令(inprog错误),javascript,angularjs,angularjs-directive,angular-http,Javascript,Angularjs,Angularjs Directive,Angular Http,我已经为此搜索和尝试了很多东西,我想也许我只是做错了 我有一个单页应用程序,它有非常相似的DOM片段,只有从服务中输入的数据才有区别。每个DOM片段都有一个不同的web服务 我的HTML看起来像这样 <div section="foo"> <ul> <li ng-repeat="item in collection">{{item.name}}</li> </ul> </div> <di
<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>
因此,它调用BaseProvider的查询方法,传入DOM元素的section属性。所以,在我的例子中,“foo”或“bar”
BaseProvider如下所示:
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 **
});
}
};
}]);
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错误
我试过这些建议,但还是有问题。在这一点上,我已经没有主意了,也许我希望有一个可重用的指令和一个单一的提供者来驱动整个过程不是一条好路
我使用FooCtrl和BarCtrl实现了这一切,但我重复了很多次,感觉好像是错的。如果您使用的是angular 1.2.x或更高版本,您的指令将不起作用,因为它使用的是隔离作用域。隔离作用域意味着您分配给作用域的任何变量只能在作用域的内部模板中使用(表示指令中使用
模板:
属性定义的模板)
由于您的指令没有模板,因此不应使用隔离作用域。而应执行以下操作:
scope: {}
你应该做:
scope: true
这将使指令创建一个作用域,但不会将其隔离。这将使您的指令的作用域可用于外部模板(即您的ng repeat)
记住这一点,如果指令中没有定义模板,则几乎不应使用隔离作用域。如果使用angular 1.2.x或更高版本,则指令将不起作用,因为它使用的是隔离作用域。隔离作用域意味着您分配给作用域的任何变量只能在作用域的内部范围内使用模板(指指令中使用
模板:
属性定义的模板
由于您的指令没有模板,因此不应使用隔离作用域。而应执行以下操作:
scope: {}
你应该做:
scope: true
这将使指令创建一个作用域,但不会将其隔离。这将使您的指令的作用域可用于外部模板(即您的ng repeat)
记住这一点,如果您的指令中没有定义模板,那么您几乎不应该使用隔离作用域。您能澄清一下您在这里真正想要实现的是什么吗?您想共享dom,但绑定到不同的数据和数据的不同属性?是否有两个部分或两个以上?另外,我可能错了,但我没有我不认为指令是实现这一点的最佳方式。嵌套控制器可能是更好的选择。嵌套控制器可能更好。我正在寻找一种方法来避免与多个指令分别执行$http GET和$scope有关的进程问题。$apply用于更新DOM。有两个以上的部分。您能澄清一下吗你真的想在这里实现吗?你想共享dom,但绑定到不同的数据和数据的不同属性?有两个部分还是两个以上?还有,我可能错了,但我不认为指令是实现这一点的最佳方式。嵌套控制器可能是更好的选择。嵌套控制器可能更好。我很抱歉我正在寻找一种方法来避免与多个指令分别执行$http GET和$scope有关的inprogress问题。$apply用于更新DOM。不止两个部分。这很好。这会解决与多个指令执行$http GET并尝试使用$scope更新DOM有关的inprogress问题吗?$apply?如果我正确理解,执行作用域:true将把它推到一个沙箱类型的作用域,就像控制器使用的一样,这将解决运行到它自己的摘要,因为我不需要执行作用域。手动应用-它将按照预期的方式更新作用域,所有内容都会回到原来的位置。这绝对修复了它。我讨厌如此接近和简单没有看到它。非常感谢。您不应该在$htpp.GET上使用$scope.$apply()。$http服务是一个角度服务,因此已经知道它应该执行摘要循环。除非您绑定到浏览器dom事件,否则很少需要使用$apply(),在这种情况下,您需要将代码包装在$apply()中。这很好。这能解决与执行$http GET并尝试使用$scope更新dom的多个指令相关的inprogress问题吗?$apply?如果我理解正确,执行scope:true将把它推到一个沙箱类型的范围,就像控制器使用的那样,这将解决运行到它自己的摘要,因为我不需要这样做scope.apply手动-它将按预期方式更新scope,所有内容都会恢复到原来的位置。这绝对解决了它。我讨厌离得太近而看不到它。非常感谢。你不应该使用$scope。$apply()在$htpp.GET上,$http服务是一个角度服务,因此已经知道它应该执行摘要循环。除非绑定到浏览器dom事件,否则很少需要使用$apply(),在这种情况下,需要将代码包装在$apply()中。