2016-10-09 90 views
0

我有一個包含幾個刪除按鈕有點像這樣的角度應用:改造「警報()」上刪除按鈕

<button class="btn btn-default" ng-click="delete($index)">x</button> 

現在,我們正在接近生產的部署,我想刪除按鈕表現得很好,並「在實際刪除對象之前警告()「用戶。

如何通過指令在所有刪除按鈕中改寫此功能。我想有一個叫「問」的指令:

<button ask class="btn btn-default btn-xs" ng-click="delete($index)">x</button> 

我可以用它來影響任何按鈕的行爲。

不知怎的,我不能想通過這個

app.directive("ask", function() { 
    return function(scope, elems, attrs) { 
    // what to do here: 
    // 1. shall I change the elems.attr("ng-click") 
    // 2. or scope.attrs("ngClick") 
    ???? 
    } 
}); 

請指引我最好的做法以及一些代碼示例。還要注意,所有刪除按鈕的ng-click回調是不同的,應用程序已經廣泛使用了隔離範圍和子範圍指令。

回答

1

試試這個實施

angular 
 
    .module('test', []) 
 
    .directive('ask', function() { 
 
    return { 
 
     restrict: 'A', 
 
     scope: {ask: '@', onAsk: '&'}, 
 
     link: function(scope, elem, attrs) { 
 
     elem.on('click', function(e) { 
 
      if(confirm(attrs.ask)) { 
 
      scope.onAsk(); 
 
      scope.$apply(); 
 
      } 
 
     }); 
 
     } 
 
    }; 
 
    }) 
 
    .controller('ItemsCtrl', function($scope) { 
 
    $scope.items = [1,2,3,4,5]; 
 
    $scope["delete"] = function(index) { 
 
     $scope.items.splice(index, 1); 
 
    }; 
 
    })
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="test" ng-controller="ItemsCtrl"> 
 
    <ul><li ng-repeat="item in items track by $index">{{item}} 
 
    <button ask="Are you sure you want to delete item?" on-ask="delete($index)">x</button> 
 
    </li> 
 
    </ul> 
 
</div>

+0

這種方法很好,它也幫助我保留這些按鈕的樣式。爲什麼在這裏需要「$ apply」?即使寫了大約15K行的角碼之後,我在這方面的概念並不明確。 –

+1

因爲我在這裏使用了一個本地事件監聽器('on('click',...')而不執行scope。$ apply angular並不是你希望在修改數組之後更新視圖。運行摘要循環,並在拼接後元素將更新你的列表。如果你選中 - 沒有它的數組修改,但視圖不會退回 –

1

您可以構建一個directive這和templatedirectivebutton元素和ng-click事件。

通過indexdelete作爲該指令的輸入。

app.directive("deleteFruit", function(){ 
    return{ 
    // You can also pass one more binding if you want to have a specific alert message 
    scope:{ 
     index: '@', delete:'&' 
    }, 
    template:'<button class="btn btn-default" ng-click="deleteFruit()">x</button>', 
    link: function(scope){ 
     scope.deleteFruit = function(){ 
     // When user clicks, first call the alert function then use the promise returned by dialog and check whether user wants to delete or not 
     //modal.dialog().then(function(userSelectedOption){ 
      // If user wants to delete then go a head and call delete function on main controller 
     // if(userSelectedOption){ 
     // scope.delete(scope.index); 
     // } 
     //}) 
     scope.delete(scope.index); 
     } 
    } 
    } 
}) 

MainCtrl HTML

<delete-fruit delete="delete(index)" index={{$index}}></delete-fruit> 

Plunker

+0

不錯,只有一個小缺點是,我的所有按鈕的樣式不同。解決方案可以稍微修改@Gudz的行來解決這個問題。 –

+0

你也可以傳遞樣式以及使用'ng-style','ng-class'等。 –