2013-10-15 4 views
7

Я использую этот сценарий, чтобы иметь диалог подтверждения перед тем как стрелять функцию нг щелчкаПредотвратить нг щелкните от стрельбы для диалога подтверждения (перестал работать в угловых 1.2 RC3)

Directives.directive('ngConfirmClick', [ 
    function(){ 
    return { 
     priority: 100, 
     restrict: 'A', 
     link: function(scope, element, attrs){ 
     element.bind('click', function(e){ 
      var message = attrs.ngConfirmClick; 
      if(message && !confirm(message)){ 
      e.stopImmediatePropagation(); 
      e.preventDefault(); 
      } 
     }); 
     } 
    } 
    } 
]); 

, как видно на http://zachsnow.com/#!/blog/2013/confirming-ng-click/

она используется с помощью:

<button ng-confirm-click="Are you sure?" ng-click="remove()">Remove</button> 

Есть и другие подобные сценарии здесь на SO, но , так как я обновлено до Angular 1.2 RC3, они перестали работать. Функция ng-click всегда срабатывает до того, как будет задействована действительная функция ссылки.

Я также попытался увеличить приоритет и прослушать другие события (touchstart, потому что новейшие угловые имеют эти новые директивы ngtouch). Но ничего не работает.

ответ

14

Ах, я решил, что решил!

Недавно был совершить по угловой команде, которые изменили приоритет перед/после связывания: https://github.com/angular/angular.js/commit/31f190d4d53921d32253ba80d9ebe57d6c1de82b

Это теперь включено в угловом 1.2 RC3!

Поэтому функция связывания сообщений имеет теперь обратный приоритет.

Итак, есть два способа решить эту проблему. Либо использовать отрицательный приоритет в настоящее время

Directives.directive('ngConfirmClick', [ 
    function(){ 
    return { 
     priority: -100, //<--------- 
     restrict: 'A', 
     link: function(scope, element, attrs){ 
     element.bind('click', function(e){ 
      var message = attrs.ngConfirmClick; 
      if(message && !confirm(message)){ 
      e.stopImmediatePropagation(); 
      e.preventDefault(); 
      } 
     }); 
     } 
    } 
    } 
]); 

ИЛИ преобразовать функцию в заранее функцию связующей

Directives.directive('ngConfirmClick', [ 
    function(){ 
    return { 
     priority: 100, 
     restrict: 'A', 
     link: { 
      pre: function(scope, element, attrs){ //<--------- 
       element.bind('click touchstart', function(e){ 
        var message = attrs.ngConfirmClick; 
        if(message && !window.confirm(message)){ 
        e.stopImmediatePropagation(); 
        e.preventDefault(); 
        } 
       }); 
       } 
     } 
    } 
    } 
]); 
+2

я использовал последний подход и превратила его в предварительно функцию связующей, кажется более естественным для меня, чем иметь отрицательный приоритет –

+0

Ни один из них не работает в угловом 1.2.15. Вы видите диалоговое окно подтверждения, но оно не останавливает распространение события. Любая идея почему? – cayblood

+0

Sry для позднего ответа, но, возможно, это помогает другим. Мы используем угловой 1.2.16, и здесь он работает так, как ожидалось, как описано выше. –