Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 等待$resource完成加载到我的控制器,然后继续_Angularjs_Rest_Symfony_Angular Resource_Ngresource - Fatal编程技术网

Angularjs 等待$resource完成加载到我的控制器,然后继续

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( "

我正在用fosrestbundle构建一个restapi,并用angular和Twig模板管理前端。我的url地址上的一个如下所示:

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浏览器,现在它运行良好