在继续

时间:2016-12-31 20:38:17

标签: angularjs rest symfony angular-resource ngresource

我用fosrestbundle建立一个休息api,然后用angular and Twig模板管理前端。我的网址上的一个地址如下:

http://mywebsite/myroute/idContain

当我在浏览器中加载网址时,在一个twig模板(html类型)中,我检索参数" idContain" (来自fosrestbundle控制器)使用ng-init of angularjs,如下所示:

<div class="container-fluid" ng-init="getContainByID({{ idContain }})">
  //...lot html div with angularjs directives
</div>

立即,ng-init将转到我的angularJS应用程序找到getContainByID(idContain)来运行它。 这个看起来像这样:

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)来自我的休息服务,如下所示:

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资源)完成加载才能继续加载?

1 个答案:

答案 0 :(得分:1)

$resource发出异步请求,但会立即重新生成一个空对象或数组。

您可以通过多种方式处理问题。

可以不用担心在视图中声明$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;
});

另一种方法是使用基于相同承诺的路由解析,以便在请求完成之前输入路由(或状态,具体取决于路由器)