2013-10-27 13 views
40

Tôi có một tình huống trong ứng dụng mà tôi cần tải lại menu mỗi khi vai trò của người dùng thay đổi (Một người dùng có thể có vai trò ở một số công ty).

Tôi đã tự hỏi cách tốt nhất để tiếp cận vấn đề này là gì.

Hiện tại tôi đang làm như sau:

app.controller('menuLoadingCtrl', function($location, $scope, authService){ 
    $scope.model.initialRole = authService.getRole(); 
    $scope.$watch(function(){return authService.getRole()}, function(val){ 
     if(val && val != $scope.model.initialRole){ 
       $scope.layout.menuSrc = 'partials/menu.html'; 
     } 
    }); 
}) 

đơn giản chuyển hướng người dùng đến xem nạp trình đơn, và từ đó, trở lại giao diện menu khi vai trò được thực hiện tải. Tôi có tính năng này được bao bọc trong một chức năng:

$scope.layout.reloadMenu = function(){ 
     $scope.layout.menuSrc = 'partials/menuLoading.html'; 
    } 

mà tôi gọi bất kỳ tình huống nào mà tôi muốn tải lại menu.

Tôi đã tự hỏi liệu tôi có thể làm cho quá trình này tự động hơn bằng cách phát sự kiện này từ dịch vụ trên $ rootScope và sau đó lắng nghe nó trong bộ điều khiển.

Bất kỳ suy nghĩ \ lời khuyên nào về điều này sẽ được đánh giá cao.

Trả lời

52

$watch() đang tiến hành kiểm tra bụi bẩn: chức năng sẽ so sánh từng chu kỳ tiêu hóa. Mặt khác, $broadcast() chỉ truyền một sự kiện khi có sự kiện. Đương nhiên, $broadcast() rẻ hơn $watch().

Nhưng bạn có thực sự phải lo lắng về hiệu suất ở đây không? Một so sánh nguyên thủy của chu kỳ là không có gì. Tuy nhiên, khái niệm, $watch() rõ ràng là những gì bạn cần: bạn muốn thực hiện một hành động mỗi lần biến thay đổi. Tôi không thể tưởng tượng sử dụng $broadcast() tại đây.

+5

+1 rõ ràng và súc tích. Tôi chỉ muốn thêm rằng mã OP không nên có '$ watch' hoặc' $ broadcast' trong bộ điều khiển ở vị trí đầu tiên - thay vì OP nên quấn 'authService' trong một dịch vụ Angular hoặc tốt hơn, một' $ q' lời hứa. –

+0

Cảm ơn câu trả lời nhanh chóng. Tôi đoán nó là con đường đúng để đi sau đó, vấn đề duy nhất là theo cách này tôi cần phải gọi một chức năng nhất định mỗi khi tôi muốn tải lại menu, gây ra một số lượng lớn mã, do đó bảo trì nhiều hơn. Thực hiện kiểm tra bẩn ở cấp độ dịch vụ và việc phát rộng rãi sẽ làm cho hành động này tự động, tuy nhiên sẽ không cho phép tôi hiển thị trình tải trong khi yêu cầu đến máy chủ giải quyết. –

+0

Ngoài ra, tôi cần đặt cờ cho bộ điều khiển cho trường hợp mà tôi đặt kiểu vai trò đồng bộ, chẳng hạn như đăng nhập \ đăng xuất. –

Các vấn đề liên quan