在 angular 配置状态期间加载数据
Load data during angular config state
简介:
应用侧边栏的第三方导航指令,建议在配置阶段加载数据。菜单项是动态的,并根据用户凭据在服务器上解析。
问题陈述:
虽然数据加载正常,但永远不会执行下面代码中定义的 then() 子句,因此不会填充菜单。
问题:
任何人都可以提出一种在配置阶段解决承诺的方法。
哪些回复有帮助
- 在不彻底改变代码的情况下解决上述问题的方法,或者
- 一种彻底改变代码的方法,并附有解释,例如更优雅的方式,更短的方式,当前代码是反模式,或者我没有想到的东西。
哪些回复没有帮助
- 使用另一个组件库,或者设计不当的库(这就是我正在使用的,我正在寻找如何让它工作的建议)
- 或者你为什么要做 x、y 或 z(我很乐意听取建议)
更新:在末尾添加'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;
}]
简介:
应用侧边栏的第三方导航指令,建议在配置阶段加载数据。菜单项是动态的,并根据用户凭据在服务器上解析。
问题陈述:
虽然数据加载正常,但永远不会执行下面代码中定义的 then() 子句,因此不会填充菜单。
问题:
任何人都可以提出一种在配置阶段解决承诺的方法。
哪些回复有帮助
- 在不彻底改变代码的情况下解决上述问题的方法,或者
- 一种彻底改变代码的方法,并附有解释,例如更优雅的方式,更短的方式,当前代码是反模式,或者我没有想到的东西。
哪些回复没有帮助
- 使用另一个组件库,或者设计不当的库(这就是我正在使用的,我正在寻找如何让它工作的建议)
- 或者你为什么要做 x、y 或 z(我很乐意听取建议)
更新:在末尾添加'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;
}]