2013-07-01 111 views
18

如果你有一個控制器來操作Angular.js $範圍內的變量,有一個慣用的方式:重新初始化Angular.js控制器

  • 復位控制器的$範圍,
  • 重啓控制器初始化?

對於複雜的控制器來說,非常方便不必將每個變量都重置爲初始值,特別是如果您真正想要的是對控制器和範圍的簡單重新初始化。不過,通過$location.path()再次導航到相同的URL並沒有幫助。

編輯:假設我無法使用任何$window.location黑客,因爲這會違反Chrome Packaged Apps中的CSP。

回答

22

剛問完,我終於找到了一種方法來解決這個問題,使用$route.reload()

myapp.Controller('SampleController', function($location, $route) { 

    $scope.navTo = function(url) { 
    if ($location.path() === url) { 
     $route.reload(); 
    } else { 
     $location.path(url); 
    } 
    } 

}); 

我還在想,必須有一些更優雅的解決方案,但這絕對適用於我。

+1

我不同意,我覺得這是一個非常優雅的解決方案。從某種意義上說,你正在重新加載頁面,所以$ route.reload()很有意義。 – wvdz

+6

@popovitsj:雖然很高興知道這不必被認爲是不好的做法,但我仍然沒有真正相信。雖然你肯定對這個解決方案有一些吸引力,因爲語義上'$ route.reload()'類似於重新加載頁面,它仍然會產生很多開銷。這在很多特定的用例中可能是可以忽略的(當時它確實是在我的範圍內),但是如果有一個同樣乾淨的方法可以避免造成這種開銷,那還是很不錯的。 – bfncs

+0

我們可以在私有方法中移動oninit的內容(稱爲'init')並從oninit調用它並最終使用相同的私有方法重置控制器多次,只要我們想要? – JVM

2

如果您正在使用角UI的路由器,那麼你應該做的是這樣的:

myapp.Controller('SampleController', function($state) { 

    $scope.navigate = function (stateName) { 
     if ($state.is(stateName)) { 
      $state.reload(); 
     } else { 
      $state.go(stateName); 
     } 
    } 
});