在控制器中设置app.config

时间:2016-07-23 09:13:03

标签: angularjs

所以,我有我的app.controller,其中有我的请求。请求成功后,我想将检索到的数据设置为某个$provider属性,即

app.controller('someCtrl', function(){
  app.config(function($someProvider){
    $someProvider.property = response.data;
    $someProvider.function(response.data.status);
  })
})

我正在尝试在控制器中设置它,但它什么也没做。什么提示,伙计们? :)

3 个答案:

答案 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>