我有一个Angular应用程序,其中包含在av MVC视图中定义的菜单。因此菜单与应用程序中的路线无关。在菜单控制器中,我想注入一个包含当前用户数据的对象。然后我将循环此对象以决定用户应该看到哪些菜单项。
工厂看起来像这样:
.factory('currentUser', ['currentUserResource', function (currentUserResource) {return currentUserResource.get()}])
get方法是标准的$ resource GET方法。
问题是,工厂返回一个需要很短时间才能解决的承诺。因此,在我的控制器中,一些菜单项在承诺解决之前得到处理,并且没有显示它们应该显示的时间。
在我的控制器中,我注入' currentUser',然后尝试以这些方式使用:
$scope.currentUser = currentUser.then(function (data){
return data
});
$scope.currentUser = currentUser;
currentUser.then(function(data){
$scope.currentUser = data;
});
有没有办法,如果没有使用路由解析,我可以确保在加载控制器之前解析了currentUser,或者至少控制器首先解析了它?
答案 0 :(得分:1)
使用$promise
对象的$resource
属性来延迟控制器的工作。
resourceObject.$promise.then ( function onFulfilled(object) {
//Do work that needs fulFilled object
}).catch (function onRejected(response) {
console.log(response.status)
});;
如果resourceObject
已解决,则onFulfilled
功能将立即执行。如果resourceObject
尚未解决,则$q
服务将在调用onFulfilled
函数之前等待。
重要的是要意识到调用
$resource
对象方法会立即返回一个空引用(对象或数组,具体取决于isArray
)。从服务器返回数据后,将使用实际数据填充现有引用。资源实例和集合具有以下附加属性:
$promise
:创建此实例或集合的原始服务器交互的promise。成功时,使用相同的资源实例或集合对象解析promise,并使用来自服务器的数据进行更新。这使得在$routeProvider.when()的解析部分中使用它很容易推迟视图渲染,直到资源被加载。
失败时,使用http response对象拒绝承诺,但没有资源属性。