Angularjs 等待$resource完成加载到我的控制器,然后继续
我正在用fosrestbundle构建一个restapi,并用angular和Twig模板管理前端。我的url地址上的一个如下所示:Angularjs 等待$resource完成加载到我的控制器,然后继续,angularjs,rest,symfony,angular-resource,ngresource,Angularjs,Rest,Symfony,Angular Resource,Ngresource,我正在用fosrestbundle构建一个restapi,并用angular和Twig模板管理前端。我的url地址上的一个如下所示: http://mywebsite/myroute/idContain angular.module("MyServiceRest", ['ngResource']) .factory("myService", function ($rootScope, $resource) { var apiData = $resource( "
http://mywebsite/myroute/idContain
angular.module("MyServiceRest", ['ngResource'])
.factory("myService", function ($rootScope, $resource) {
var apiData = $resource(
"/api", {},
{
...
"getContains": {method: 'GET', isArray: false, url: "mywebsite/api/myroute/:containid"}
...
});
return {
getContains: function (idContain) {
return apiData.getContains({containid: idContain});
}
}
});
当我在浏览器中加载url时,在细枝模板(类似于html)中,我使用angularjs的ng init检索参数“idContain”(从fosrestbundle控制器提交),如下所示:
<div class="container-fluid" ng-init="getContainByID({{ idContain }})">
//...lot html div with angularjs directives
</div>
angular.module("myApp", ["ngSanitize", 'angular.filter', 'ui.tinymce', ...])
.config(function($interpolateProvider, ...) {
$interpolateProvider.startSymbol('{[{').endSymbol('}]}');
})
.controller("myCtrl",function ($filter,..., myService)
{
// lot of code...
$scope.getContainByID = function(idContain)
{
$scope.currentContain = myService.getContains(idContain);
$scope.containRoot = $scope.currentContain.contain.containRoot;
...
}
// lot of code...
}
事实上,myService.getContains(idContain)
来自我的rest服务,如下所示:
http://mywebsite/myroute/idContain
angular.module("MyServiceRest", ['ngResource'])
.factory("myService", function ($rootScope, $resource) {
var apiData = $resource(
"/api", {},
{
...
"getContains": {method: 'GET', isArray: false, url: "mywebsite/api/myroute/:containid"}
...
});
return {
getContains: function (idContain) {
return apiData.getContains({containid: idContain});
}
}
});
现在的问题是,当我运行我的angularjs应用程序时,$scope.containRoot并没有等到myService.getContains(idContain)(来自我的异步$resource服务)完成加载,并导致错误使我的webapp崩溃
如何强制$scope.containRoot和我的角代码的其余部分等待
myService.getContains(idContain)
(连接到api资源)完全完成加载后再继续?
发出异步请求,但立即重新获取空对象或数组
有很多方法可以解决你的问题
不必担心声明$scope.containRoot
,只需在视图中使用currentContain.contain.containRoot
。此属性将在收到请求后呈现
另一种方法是使用$resource
返回的$promise,并在promise回调中分配scope属性
$scope.currentContain = myService.getContains(idContain);
$scope.currentContain.$promise.then(function(){
$scope.containRoot = $scope.currentContain.contain.containRoot;
});
另一种方法是使用基于相同承诺的路由解析,以便在请求完成之前不输入路由(或状态,取决于路由器)在尝试执行您的操作时遇到此错误:
angular.js:14328错误:[$injector:unpr]未知提供者:$promiseProvider不应该得到它,除非您将$promise
注入控制器,而您不这样做是的,我做到了!我刚刚删除了它,我得到了另一个错误:angular.js:14328 TypeError:无法读取ChildScope中未定义的属性'then'。$scope。getContainByID(http://localhost:8000/js/angular-app/app.js:75:45).
非常奇怪!我只是重新运行了我的服务器和我的chrome浏览器,现在它运行良好