2016-07-23 68 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屬性,則會導致突然發生的更改,恕不另行通知,這會使測試失敗。

設計糟糕的第三方服務在接受這種治療時不會引起不良影響是可以接受的。和其他任何黑客一樣,它應該完全覆蓋測試。