2013-07-01 30 views
18

nếu bạn có một bộ điều khiển để thao tác $ phạm vi biến trong Angular.js, là có một cách thành ngữ để:reinitialize một bộ điều khiển Angular.js

  • reset phạm vi $ của bộ điều khiển, và
  • khởi động lại bộ điều khiển khởi ?

Đối với bộ điều khiển phức tạp, sẽ rất thuận tiện để không phải đặt lại mọi biến về giá trị ban đầu, đặc biệt là những gì bạn thực sự muốn là khởi động lại đơn giản của bộ điều khiển và phạm vi. Tuy nhiên, điều hướng đến cùng một URL thông qua $location.path() không giúp ích gì.

Chỉnh sửa: Giả sử tôi không thể sử dụng bất kỳ $window.location hack nào vì điều này sẽ vi phạm CSP trong Ứng dụng được đóng gói của Chrome.

Trả lời

22

Chỉ sau khi hỏi, cuối cùng tôi đã tìm thấy một cách để giải quyết vấn đề này bằng cách sử dụng $route.reload().

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

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

}); 

Tôi vẫn nghĩ rằng phải có một số giải pháp thanh lịch hơn, nhưng điều này chắc chắn phù hợp với tôi.

+1

Tôi không đồng ý, tôi nghĩ rằng đây là một giải pháp hoàn hảo nhã. Trong một nghĩa nào đó, bạn đang tải lại trang, vì vậy $ route.reload() tạo ra rất nhiều ý nghĩa. – wvdz

+6

@popovitsj: Trong khi thật tuyệt khi biết rằng điều này không phải được coi là hành vi xấu, tôi vẫn chưa thực sự thuyết phục. Mặc dù bạn chắc chắn rằng có một số khiếu nại đối với giải pháp này vì ngữ nghĩa '$ route.reload()' tương tự như tải lại trang, nó vẫn tạo ra rất nhiều chi phí. Điều này có thể được bỏ qua trong rất nhiều trường hợp sử dụng cụ thể (nó chắc chắn là trong tôi tại thời điểm đó), nhưng nó vẫn sẽ được tốt đẹp để có một phương pháp sạch sẽ bằng nhau tránh được việc tạo ra chi phí này. – bfncs

+0

Chúng ta có thể di chuyển nội dung của oninit trong một phương thức riêng (gọi là 'init') và gọi nó từ oninit và cuối cùng sử dụng cùng một phương thức riêng để thiết lập lại bộ điều khiển nhiều lần như chúng ta muốn? – JVM

2

Nếu bạn đang sử dụng góc-ui-router thì bạn nên làm điều đó theo cách này:

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

    $scope.navigate = function (stateName) { 
     if ($state.is(stateName)) { 
      $state.reload(); 
     } else { 
      $state.go(stateName); 
     } 
    } 
}); 
Các vấn đề liên quan