在角配置状态期间加载数据

时间:2015-02-08 22:02:09

标签: angularjs angular-promise

简介

应用程序侧栏的第三方导航指令,建议在配置阶段加载数据。菜单项是动态的,并根据用户凭据在服务器上解析。

问题规则:

当数据加载正常时,下面的代码中定义的then()子句永远不会被执行,因此,菜单不会被填充。

问题:

任何人都可以建议在配置阶段解决承诺的方法。

哪些回复有帮助

  • 解决上述问题而不会彻底改变代码的方法,或
  • 一种从根本上改变代码的方法,例如,解释,例如更优雅的方式,更短的方式,当前的代码是反模式,或者我没想到的东西。

哪些回复无效

  • 使用另一个组件库,或设计不佳的库(这就是我正在使用的,我正在寻找如何让它工作的建议)
  • 或者你为什么要做x,y或z(我很乐意听取建议)

更新:最后添加了“什么没有用”。

谢谢,

PS。我怀疑它是否相关,但只是在案例中,使用的库是:

数据:js-data 导航:eeh-navigation

代码

服务:

   .service('init', function initFactory(DS) {

        return DS.defineResource('init', {
            name: 'init',
            idAttribute: 'id',
            endpoint: '/init',
            basePath: 'http://localhost:63342/api'
        }).findAll({idAttribute: 'id'});

    })

提供商

    .provider("initProvider", ['DSProvider', function (DSProvider) {

            this.$get = ["init", function initFactory(init) {
                return new init(init);
            }]

    }])

配置

    .config(["initProvider", 'navProvider', function(initProvider, navProvider) {


            initProvider.$get().then(function (init) {

                    angular.forEach(init, function (value, key) {

                        navProvider.sidebarMenuItem(value.name, {
                            text: value.text,
                            iconClass: value.iconClass,
                            href: value.url
                        });
                    })


            })
    }])

什么没有效果(到目前为止)

@Bricktop建议使用承诺(我认为)提供者,这是改变,但是;(不幸的是它不起作用,.then永远不会到达。

提供者:

                var promise = $q(function(resolve, reject) {
                    setTimeout(function() {
                        if (new init(init)) {
                            resolve(init);
                        } else {
                            reject('failed');
                        }
                    }, 1000);
                });

                return promise;

1 个答案:

答案 0 :(得分:2)

我并不过分熟悉提供商的使用,因为他们并没有经常使用,但我认为我有一个解决问题的想法。

您正在使用的.then需要承诺才能工作,只要解决了先前的承诺就会调用它,并在成功或失败时执行函数。但是,我不认为您的提供商会返回承诺,而只是返回服务。

要返回承诺,您应该能够使用$q记录here.使用正确的承诺设置,您的then应该被执行。我希望这有助于解决您的问题,如果不是,我会尝试改进我的答案。

这是一个显示我的意思的片段:

this.$get = ["init", function initFactory(init) {
  var deferred = $q.defer();
  deferred.resolve(new init(init));
  return deferred.promise;
}]