如果你有一個控制器來操作Angular.js $範圍內的變量,有一個慣用的方式:重新初始化Angular.js控制器
- 復位控制器的$範圍,
- 重啓控制器初始化?
對於複雜的控制器來說,非常方便不必將每個變量都重置爲初始值,特別是如果您真正想要的是對控制器和範圍的簡單重新初始化。不過,通過$location.path()
再次導航到相同的URL並沒有幫助。
編輯:假設我無法使用任何$window.location
黑客,因爲這會違反Chrome Packaged Apps中的CSP。
如果你有一個控制器來操作Angular.js $範圍內的變量,有一個慣用的方式:重新初始化Angular.js控制器
對於複雜的控制器來說,非常方便不必將每個變量都重置爲初始值,特別是如果您真正想要的是對控制器和範圍的簡單重新初始化。不過,通過$location.path()
再次導航到相同的URL並沒有幫助。
編輯:假設我無法使用任何$window.location
黑客,因爲這會違反Chrome Packaged Apps中的CSP。
剛問完,我終於找到了一種方法來解決這個問題,使用$route.reload()
。
myapp.Controller('SampleController', function($location, $route) {
$scope.navTo = function(url) {
if ($location.path() === url) {
$route.reload();
} else {
$location.path(url);
}
}
});
我還在想,必須有一些更優雅的解決方案,但這絕對適用於我。
如果您正在使用角UI的路由器,那麼你應該做的是這樣的:
myapp.Controller('SampleController', function($state) {
$scope.navigate = function (stateName) {
if ($state.is(stateName)) {
$state.reload();
} else {
$state.go(stateName);
}
}
});
我不同意,我覺得這是一個非常優雅的解決方案。從某種意義上說,你正在重新加載頁面,所以$ route.reload()很有意義。 – wvdz
@popovitsj:雖然很高興知道這不必被認爲是不好的做法,但我仍然沒有真正相信。雖然你肯定對這個解決方案有一些吸引力,因爲語義上'$ route.reload()'類似於重新加載頁面,它仍然會產生很多開銷。這在很多特定的用例中可能是可以忽略的(當時它確實是在我的範圍內),但是如果有一個同樣乾淨的方法可以避免造成這種開銷,那還是很不錯的。 – bfncs
我們可以在私有方法中移動oninit的內容(稱爲'init')並從oninit調用它並最終使用相同的私有方法重置控制器多次,只要我們想要? – JVM