我正在使用Angular UI路由器(非常新的版本),我試圖更新搜索參數,而不是重新加載整個頁面。我想要$ watch $ stateParams,但手錶無法使用我的設置。爲了清楚起見,當我使用transitionTo()時,我希望更新URL,並且我希望$ stateParams被更新,$ watch被激發到$ stateParams,但是我不希望整個控制器再次運行。 reloadOnSearch:false阻止控制器再次運行,但具有停止觸發$ watch的副作用,或者看起來如此。反正這裏是我的代碼
$ stateProvider配置:
$urlRouterProvider.otherwise("/search");
$stateProvider
.state('search', {
url: "/search?locationtext&method",
templateUrl: "templates/searchResults.tpl.html",
controller: 'SearchResultsCtrl as searchResults',
reloadOnSearch : false
})
按鈕單擊處理程序:
$state.transitionTo($state.current, {locationtext: 'london'}, {
location : true,
reload: false,
inherit: false,
notify: true
});
$看國家PARAMS:
$scope.stateParams = $stateParams;
$scope.$watchCollection('stateParams', function(){
$log.info("State params have been updated", $scope.stateParams);
});
這是正在發生的事情:
1)首次加載狀態時,手錶會觸發並且狀態列將記錄到控制檯。
2)當我點擊按鈕,狀態被轉換和URL說#/搜索?locationtext =倫敦
3)手錶是不是在這一點上發射,雖然執行console.log顯示, $ state.params已更新
4)如果我點擊瀏覽器後退按鈕,位置文本=倫敦從URL中刪除,但手錶不會再觸發。
不知道我在做什麼錯在這裏。我假設我已經正確設置了手表,否則在控制器第一次加載時它不會啓動?
任何想法將不勝感激。
編輯:
我還增加了以下
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){
console.log("$stateChangeStart", $rootScope.stateParams);
});
但該事件甚至沒有開火,儘管URL變化和$ state.params作爲transitionTo後不同( );
編輯2:
我已經通過拖網的代碼,它好像reloadOnSearch設置爲false意味着,如果你只改變搜索參數,然後什麼也沒有發生,即使網址變更的過渡沒有按不會發生,$ stateChangeStart事件不會被廣播。
這不是我所期待的。我期待着所有這些發生,但控制器不會被重新加載。因此,現在我正在尋找一種方法來更改搜索參數並監視更改,以便我可以更新搜索結果。它看起來像Angular UI路由器沒有辦法做到這一點,因爲你得到一個控制器重新加載或沒有事件。
點擊處理程序是如何綁定的?它是否在'$ digest'循環之外? (由非Angular事件,或setTimeout,或類似的東西引起的?)'$ state.transitionTo'不會觸發'$ apply'本身,所以如果是這種情況,你必須包裝它。 – DRobinson
它由Angular UI分頁控件觸發,我認爲它使用ng-click模板。 – jonhobbs
是的,那絕對是用ng-click包裹的,應該沒問題... – DRobinson