2014-02-20 97 views
0

我創建了一個Angular服務,它作爲一個簡單的機制,在整個我的應用程序(代碼如下)的常見位置處理成功/警告/錯誤/信息警報給用戶。這些警報綁定到Angular-UI警報元素,列出所有警報。我的控制器處理管道。

所以我的問題是如何導致我的應用程序中的每個控制器調用$ alert.clear()在控制器的銷燬?我相信我可以從每一個控制器調用這樣的事情該做硬盤的方式:

$scope.$on('$destroy', function(){ 
    $alerts.clear(); 
}); 

不過,我真的不希望這樣的樣板東西洋洋灑灑。我希望能夠在我的應用程序中控制所有控制器通用的行爲,並忘記它。

預先感謝您在正確的方向輕輕推動或暴力thwack!

HTML片段

<alert ng-repeat="alert in alerts" type="alert.type" close="closeAlert($index)">{{alert.msg}}</alert> 

service.alert.js

app.factory('$alert', function() { 

    var alerts = []; 

    var clearAlerts = function() { 
     alerts = []; 
    }; 

    var closeAlert = function(index, clearOthers) { 
     alerts.splice(index, 1); 
    }; 

    var createAlert = function(type, message, clearOthers) { 
     if (clearOthers) 
      alerts = []; 

     alerts.push({type: type, msg: message}); 
    }; 

    var alertSuccess = function(message, clearOthers) { 
     clearOthers = clearOthers || true; 
     createAlert('success', message, clearOthers); 
    }; 

    var alertInfo = function(message, clearOthers) { 
     clearOthers = clearOthers || true; 
     createAlert('info', message, clearOthers); 
    }; 

    var alertWarning = function(message,clearOthers) { 
     clearOthers = clearOthers || true; 
     createAlert('warning', message, clearOthers); 
    }; 

    var alertDanger = function(message, clearOthers) { 
     clearOthers = clearOthers || true; 
     createAlert('danger', message, clearOthers); 
    }; 

    return { 
     $alerts: function() { return alerts; }, 
     $success: function(message, clearOthers) { return alertSuccess(message, clearOthers); }, 
     $info: function(message, clearOthers) { return alertInfo(message, clearOthers); }, 
     $warning: function(message, clearOthers) { return alertWarning(message, clearOthers); }, 
     $danger: function(message, clearOthers) { return alertDanger(message, clearOthers); }, 
     $clear: function() { return clearAlerts(); }, 
     $close: function(index) { return closeAlert(index); } 
    }; 
}); 

回答

0

您可以繼承所有控制器中的控制器。 它仍然涉及到讓你的父母控制器的所有控制器的孩子,但除了它會完美地工作。

控制器的傳承就像下面這樣:

app.controller('ParentCtrl', function ($scope) { 
    "use strict"; 
    $scope.$on("$destroy", function (event, val) { 
     alert("Controller Destoryed"); 
    }); 
}); 

app.controller('ChildCtrl', ['$scope', '$controller', function ($scope, $controller) { 
    "use strict"; 
    $controller('ParentCtrl', {$scope: $scope}); 
}]); 

這裏是一個plunkr demo(注意,一個$destory事件在$scope所以這個例子作品完全一樣,如果一個$destroy事件播出後播出)

+0

美麗!謝謝!即使我必須進行顯式繼承調用,至少我可以根據需要添加常見行爲,而不用觸摸除父控制器之外的其他任何東西。我非常感謝幫助。您也向我明確表示,我需要在AngularJS文檔中進行更多的閱讀,因爲我不確定它是否在我腦海中凝聚成控制器是具有繼承性的對象。 – Michael

+0

很高興有幫助:-) – Ben

0

而言,這可能幫助你

clearAlerts: function() { 
     for(var x in this.alerts) { 
      delete this.alerts[x]; 
     } 
    } 

請看一看這個Demo

+0

我不明白爲什麼這比只是初始化一個新陣列更好。你能解釋一下嗎?謝謝! – Michael