2014-03-29 30 views
0

我越來越有如何「外包」,即在多個控制器工廠或服務中使用的功能混淆。在錯誤消息如何外包的功能,以工廠/服務

功能檢查從的WebAPI

function errorLog(error) { 
    // empty old validation errors 
    $scope.validationErrors.length = 0; 
    // get new validation errors 
    var obj = error.data.ModelState; 
    for (var key in obj) { 
     $scope.validationErrors.push(obj[key]); 
    } 
} 

響應並將它們推到變量「validationErrors」,我用它來顯示它們:

<div ng-repeat="err in validationErrors"> 
     {{err.toString()}} 
</div> 

的函數被調用$重的誤差函數源帖子並獲取原始「錯誤」通過。我不想在每個控制器中重複該功能。我想將它放在一個地方,但仍然可以將錯誤推送到每個控制器中定義的「本地」變量validationErrors。

我很高興看到正確的方向。這是使用服務還是工廠,甚至是其他概念的情況?

+0

這個結構'error.data.ModelState'對所有的控制器都是一樣的嗎? – dmahapatro

+0

是的,所有人都一樣。 – peter

回答

1

您的服務只是作爲可以注入控制器的常見狀態。如果您在服務中公開說validationErrors對象,那麼您只需將其綁定到任何本地控制器作用域,並且任何更新都應該傳播到使用它的所有控制器。這應該讓你開始:

http://jsfiddle.net/HB7LU/2863/

服務/控制器代碼:

myApp.factory('errorService', function() { 
    var cont = { validationErrors: [] }; 

    return { 
     getErrorList: function() { return cont; } 
    } 
}); 

function MyCtrl($scope, errorService) { 
    $scope.es = errorService.getErrorList();  

    $scope.es.validationErrors.push('Some error'); 
} 

function MyOtherCtrl($scope, errorService) { 
    $scope.es = errorService.getErrorList(); 

    $scope.es.validationErrors.push('Some other error'); 
} 

視圖(使用相同的服務2次):

<div ng-controller="MyCtrl"> 
    <div ng-repeat="err in es.validationErrors">{{err}}</div> 
</div> 
<div ng-controller="MyOtherCtrl"> 
    <div ng-repeat="err in es.validationErrors">{{err}}</div> 
</div> 

編輯:

在下面的評論之後,我意識到你只是試圖創建一個可重用的函數,而不是必須保持控制器之間的通用狀態。在這種情況下,請將您的$scope轉換爲您的服務中的常用功能。

myApp.factory('errorService', function() { 
    return { 
     errorLog: function(scope, error) { 
      // empty old validation errors 
      scope.validationErrors.length = 0; 
      // get new validation errors 
      var obj = error.data.ModelState; 
      for (var key in obj) { 
       scope.validationErrors.push(obj[key]); 
      } 
     } 
    } 
} 

內。然後你的任何控制器,注入errorService,而簡單地將POST結果,與控制器範圍一起,例如:

errorService.errorLog($scope, postError); 

而且,你並不真的需要通過範圍根目錄到您的案例中的服務。你可以簡單地通過$scope.validationErrors。一切取決於你想要的。

+0

非常感謝您的努力。但是,如何將不成功的「POST」中的「錯誤」對象傳遞給此服務?對不起,如果我最初的帖子不清楚。我在一個頁面中有5個控制器。在每個控制器中,可能會發生一些用戶觸發的後置操作。我想告訴用戶可能的驗證錯誤,在每個控制器中分開(控制器1中的錯誤與控制器2中的錯誤無關),所以我猜每個控制器都必須有自己的「驗證錯誤」 - 陣列和「錯誤」 - 對象必須發佈到工廠。 – peter

+0

希望答案更接近你正在尋找的東西。 –

+0

非常感謝您的努力和時間,希望我可以獎勵您。 – peter

1

解決方案可以是實現響應攔截器並捕獲那裏的錯誤。既然你想有多個獨立的驗證錯誤部分,你將不得不如何識別錯誤屬於哪個部分。

然後創建一個指令(例如list-validations),它將顯示之前捕獲的錯誤。您可以使用通用服務在響應攔截器之間共享錯誤,也可以讓攔截器$廣播指令將收到的錯誤。

關鍵是每個指令都應該是可配置的,以便僅顯示特定密鑰的錯誤,並且響應攔截器必須標識產生錯誤的密鑰。