2014-03-13 41 views
0

我很新,使用角度,我不知道當涉及範圍(在其他情況下,我明白解決方案是創建一個服務)共享控制器之間功能的最佳方式是什麼。

我已經寫的jsfiddle有兩個候選條件的解決方案,但我不相信任何人:

http://jsfiddle.net/zemogc/LQ59p/

的例子包括在顯示與特定類型的消息。在這個例子中,消息和類型是由表單給出的(deppending on button被稱爲soution或另一個),但在我的應用程序中會有很多不同的控制器在許多不同的頁面中顯示一條消息(並且消息div將會是包含在ng-include中),所以我創建了一個名爲ManageMes​​sage的函數,它有兩種不同的方式:

  • ManageMes​​sage服務。它的工作原理,但我需要通過$範圍作爲一個變量。不是很漂亮。
$scope.changeMessageService = function (messageText, messageType){ 
     ManageMessage.set($scope, messageText, messageType); 
    };
  • ManageMes​​sageCtrl。它也可以工作,但是我需要從MainCtrl調用$ controller方法,並將範圍作爲變量傳遞。我搜索$控制器的使用,我發現特別是在測試用例中,所以這個解決方案也不能說服我。
$scope.changeMessageController = function (messageText, messageType) { 
     $scope.message = messageText; 
     $scope.messageType = messageType; 
     $controller('ManageMessageCtrl', { 
      $scope: $scope 
     }); 
    };

那麼,什麼將是實施ManageMes​​sage使用形式不同的控制器的最佳方式? (現在我問一個具體的問題,但我的問題是通用的,我試圖在標題中恢復它)。

如果我的英語不好,請提前致謝。

回答

1

對於這個問題,我建議將status$scope分開。所以,這個想法是設計這樣的:

statusService.js

angular.module('app').factory('statusService', [function() { 

    return { 
     getStatus: function(messageType) { 

     status = {}; // could set some defaults here 
     switch (messageType) { 
      case 'error': 
       status.isOk = false; 
       status.isLoading = false; 
       status.isError = true; 
       status.noMessage = false; 
       break; 
      case 'ok': 
       status.isOk = true; 
       status.isLoading = false; 
       status.isError = true; 
       status.noMessage = false; 
       break; 

      case 'loading': 
       status.isOk = false; 
       status.isLoading = true; 
       status.isError = false; 
       status.noMessage = false; 
       break; 
      case 'none': 
       status.message = ''; 
       status.noMessage = true; 
       break; 
     } 

     return status; 
     } 
    } 
}]); 

控制器

myAppControllers.controller('ManageMessageCtrl', ['$scope', 'statusService', function ($scope, statusService) { 
    if ($scope.message === '') { 
     $scope.messageType = 'none'; 
    } 

    var status = statusService.getStatus($scope.messageType); 

    $scope.isOk = status.isOk; 
    $scope.isLoading = status.isLoading; 
    $scope.isError = status.isError; 
    $scope.noMessage = status.noMessage; 
    $scope.message = status.message;  

}]); 
+0

感謝您的迴應達文,這是一個很好的點,以改善ManageMes​​sageCtrl。那麼,您是否驗證了使用$ controller從MainCtrl調用ManageMes​​sageCtrl? (這是主要問題/疑問)。 – zemogc

相關問題