2013-10-21 61 views
67

我有一个简单的控制器使用$资源:AngularJS资源承诺

var Regions = $resource('mocks/regions.json'); 

$scope.regions = Regions.query(); 

我使用这个控制器的指令(在链接功能)

var regions = scope.regions; 

但地区是未定义。这是非常逻辑的调用是异步的。

我的问题是我该如何等待结果和地区是一个数组与所有数据?

UPDATE : 

这里指令

app.directive('ngMap', function() { 
    return { 
    restrict: 'EA', 
    replace: 'true', 
    scope: { 

    }, 
    template: '<div id="map"></div>', 
    controller: 'AccordMapCtrl', 
    link: function(scope, element, attrs) { 
     var regions = scope.regions; 
     console.log(regions); 

     for (var region in regions) {} 
    }; 
    }); 
+0

显示您所创建的指令定义是什么? – Chandermani

+0

它已经完成我已经添加了指令 –

+0

我有同样的问题,并通过链接功能@AndreyPushkarev使用解决方案。基本上链接函数中的所有逻辑都在'$ promise.then(function(result){...});'内。 –

回答

180

如果你想使用你需要$承诺使用回调函数异步方法,这里是例子:

var Regions = $resource('mocks/regions.json'); 

$scope.regions = Regions.query(); 
$scope.regions.$promise.then(function (result) { 
    $scope.regions = result; 
}); 
+32

为什么要做这两个中间任务?如果,正如我所期望的那样,'Regions'没有在其他地方使用,那么'resource('mocks/regions.json')。query()。$ promise.then(function(result){$ scope.regions = result;}) ;'一定会做这份工作。 –

+17

在调试代码时有助于进行中间分配 –

+1

来自$ resource docs:...调用$ resource对象方法立即返回一个空引用...这是一个有用的技巧,因为通常资源被分配给一个模型,然后由视图呈现。拥有一个空对象不会导致渲染,一旦数据从服务器到达,那么该对象将被填充数据,并且视图会自动重新渲染自己以显示新数据。 – jarz

35

如果你希望得到的资源调用承诺的定义,你应该使用

Regions.query().$q.then(function(){ .... })

更新:当前版本中的promise语句更改为

Regions.query().$promise.then(function(){ ..... })

这些谁downvoted不知道那是什么,谁第一个加入这个承诺的资源对象。我在2012年底使用此功能 - 是2012年

+0

从1.1.15开始。您可能需要考虑升级版本。 – Mahbub

+0

我正在使用1.2 RC的真实应用程序。这是一个关键任务应用程序,我只是没有尝试一些他们最近添加的花哨的东西。去年,我们的应用程序在角色中使用了该资源承诺。我们只是添加了一些人建议的补丁,Angular Team标记为“合并好”。没什么大不了的。 如果你关心那么多,然后做一个自定义的$ http包装,并使用它像资源调用,你得到承诺。 – Mahbub

+0

我是1.0.8版本的资源许诺,只是它的语法不同而已:) –

20

你也可以这样做:

Regions.query({}, function(response) { 
    $scope.regions = response; 
    // Do stuff that depends on $scope.regions here 
}); 
+9

然而,这是回调语法的权利,而不是承诺? – ericso

0
/*link*/ 
$q.when(scope.regions).then(function(result) { 
    console.log(result); 
}); 
var Regions = $resource('mocks/regions.json'); 
$scope.regions = Regions.query().$promise.then(function(response) { 
    return response; 
});