我有一个工厂和一个控制器。
vm.profiles = new ProfileFactory();
if (Object.keys(vm.profiles.items).length == 0) {
vm.noProfiles = true;
}
我在ProfileFactory中有一个原型nextPage() - > vm.profiles对象。 此方法查询后端。如果vm.profiles.items中没有项目,我想将vm.noProfiles变量设置为true。
它会自动进入if语句,因为if不会等到通过原型方法nextPage()填充项目。
如何强制JavaScript等待它填充? 有更好的解决方案吗?
这个ihere是nextPage方法的一部分。我应该在控制器中执行查询,只返回Restangular或$ http的承诺吗?
// Get List of Posts
Restangular.allUrl('user', ApiConfig.baseUrl + ':' + ApiConfig.port + '/users').getList(query)
.then(function (items) {
//console.log(items);
if (items.length > 0) {
for (var i = 0; i < items.length; i++) {
this.items.push(items[i]);
}
if (this.offset < items.meta.page_count) {
this.offset += 1;
} else {
return;
}
}
this.busy = false;
}.bind(this));
答案 0 :(得分:0)
如果您使用ui-router,则可以使用resolve feature来指定在控制器变为活动状态之前需要加载的内容。
您需要采取以下两个步骤:
在路线配置中设置解决方案。
在控制器的路径配置中,添加resolve:
键,其功能是在激活控制器之前为预先加载的项目返回承诺。有点像:
$stateProvider.state('myState', {
// ...
resolve: {
items: function(Restangular, ApiConfig /* add any other di's here */) {
return Restangular.allUrl('user', ApiConfig.baseUrl + ':' +
ApiConfig.port + '/users');
}
现在,当触发此路由时,在items:
键下的函数返回的promise被解析之前,不会加载控制器。您可以通过以下方式获得此承诺的响应:
在您的控制器中,在您的控制器定义中添加项目给您:
angular
.module('yourModuleName')
.controller('YourControllerName', function(..., items) {
// ...
// items should hold the response from the promise returning function in
// route config
});