等到对象创建 - (JavaScript / AngularJS)

时间:2015-10-21 16:04:23

标签: javascript angularjs

我有一个工厂和一个控制器。

工厂

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));

1 个答案:

答案 0 :(得分:0)

如果您使用ui-router,则可以使用resolve feature来指定在控制器变为活动状态之前需要加载的内容。

您需要采取以下两个步骤:

  1. 在路线配置中设置解决方案。

    在控制器的路径配置中,添加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被解析之前,不会加载控制器。您可以通过以下方式获得此承诺的响应:

  2. 在您的控制器中,在您的控制器定义中添加项目给您:

    angular
        .module('yourModuleName')
        .controller('YourControllerName', function(..., items) {
        // ...
        // items should hold the response from the promise returning function in 
        // route config
    });