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

Load data during angular config state

简介:

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

问题陈述:

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

问题:

任何人都可以提出一种在配置阶段解决承诺的方法。

哪些回复有帮助

哪些回复没有帮助

更新:在末尾添加'what has not worked'。

谢谢,

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;

我不太熟悉提供程序的使用,因为它们并不经常使用,但我想我有一个想法可以解决您的问题。

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

为了 return 您应该能够使用 $q 已记录的承诺 here. 通过正确的承诺设置,您的 then 应该被执行。我希望这有助于解决您的问题,如果没有,我会尝试改进我的答案。

这里有一个片段展示了我的意思:

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