2016-07-23 35 views
1

因此,我有我的app.controller,并在其中有我的请求。如果申请成功,我要检索的数据设置为一些$provider性质,即在控制器中设置app.config

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

我试图控制器内设置这一点,但什么都不做。任何提示,家伙? :)

+0

正如我在我的答案已经说过了,这个问题可以*重构*为*引导AngularJS一次异步数据就绪*。如果你想改变标题,这取决于你。目前,它非常具体,并且不太可能帮助其他人,因为他们不会以这种方式进行搜索。 –

回答

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>

+0

有趣的东西。甚至不知道这一点。 –

+0

虽然,你不能引导只有一块,即一个配置节?你必须立即启动所有的应用程序,对吧? –

+0

从技术上讲,你可以通过引导多个Angular应用程序来做到这一点。你想达到什么目的? –

2

如果默认注射不会做的工作 也许你在配置时间提供存储其他一些变量和控制器使用该变种后

angular says

在应用引导在Angular创建所有服务之前,它会配置并实例化所有提供者。我们称这个应用程序生命周期的配置阶段为 。在 阶段,服务不可访问,因为尚未创建 。

一旦配置阶段结束,与供应商的交互不允许 ,并开始创建服务的过程。我们将这个应用程序生命周期的一部分称为 运行阶段。

,所以我不知道这是否会工作

+0

感谢澄清,现在我知道这是不可能的:) –

2

新增config块配置阶段结束之后不被执行,同样适用于其他app方法,因为它们会导致额外的config块内部。

这是可能的:

app.config(($provide, $someProvider) => { 
    $provide.value('$someProvider', $someProvider); 
}); 

app.controller('someCtrl', ($someProvider) => { 
    $someProvider... 
}); 

这导致保修失效,可能表明需要解决的其他方式,这取决于$someProvider是和它的功能如何XY问题。

如果在设置$someProvider之前注入并使用$some,则会导致竞争状态。如果$some在某些时候被更改为在实例化之后未注意$someProvider属性,则会导致突然发生的更改,恕不另行通知,这会使测试失败。

设计糟糕的第三方服务在接受这种治疗时不会引起不良影响是可以接受的。和其他任何黑客一样,它应该完全覆盖测试。