所以,我有我的app.controller
,其中有我的请求。请求成功后,我想将检索到的数据设置为某个$provider
属性,即
app.controller('someCtrl', function(){
app.config(function($someProvider){
$someProvider.property = response.data;
$someProvider.function(response.data.status);
})
})
我正在尝试在控制器中设置它,但它什么也没做。什么提示,伙计们? :)
答案 0 :(得分:2)
如果默认注射不能完成这项工作 可能会在配置时将您的提供程序存储到其他变量中,稍后在控制器中使用此变量
但是angular says:
在应用程序引导期间,在Angular创建所有服务之前,它会配置并实例化所有提供程序。我们称之为 应用程序生命周期的配置阶段。在这 阶段,服务无法访问,因为它们尚未创建 爱好。
配置阶段结束后,与提供商的互动就是 不允许,并开始创建服务的过程。我们称之为 应用程序生命周期的一部分运行阶段。
所以我不知道这是否有效
答案 1 :(得分:2)
在配置阶段结束后不会执行新添加的config
块,这同样适用于其他app
方法,因为它们会在内部产生额外的config
块。
可以:
app.config(($provide, $someProvider) => {
$provide.value('$someProvider', $someProvider);
});
app.controller('someCtrl', ($someProvider) => {
$someProvider...
});
这会使保修失效,并且可能表明应该以其他方式解决的XY问题,具体取决于$someProvider
是什么以及它如何运作。
如果在设置$some
之前注入并使用$someProvider
,则会导致竞争条件。如果$some
在某些时候被更改为在实例化后没有注意$someProvider
属性,那么这将导致更改,而不会发生通知,这将导致测试失败。
设计糟糕的第三方服务可以接受这样的服务。和其他任何黑客一样,它应该完全覆盖测试。
答案 2 :(得分:1)
你的问题归结为如何推迟角度的引导过程,直到我有一些异步数据。
对于异步部分,你可以使用(或做)你想要的任何东西,这并不重要。
有趣的事实:您甚至可以在引导角度之前使用$http
,只需通过angular.injector(["ng"]).get("$http");
获取。
这就是说,当你拥有所有的异步数据时,剩下要做的就是引导角度。这可以通过angular.bootstrap
- source来实现。
这是一个工作示例,其中我异步附加一个控制器(记住,你可以做任何你想做的事情:附加各种常量,配置块等)。为简单起见,我使用setTimeout
。
// Initial Angular Code
angular.module('myApp', []);
// Async function. I've used setTimeout for simplicity's sake
setTimeout(function() {
angular
.module('myApp')
.controller('MyCtrl', ['$scope',
function($scope) {
$scope.value = 'Angular has started!';
}
]);
// Boostrap AngularJS
angular.bootstrap(document.getElementById('boostrap-me'), ['myApp']);
}, 1000);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script>
<div id="boostrap-me" ng-controller="MyCtrl">
<div ng-bind="value">Angular hasn't yet bootstrapped as we're waiting for some async data!</div>
</div>