2013-06-07 3 views
1

я получил следующую директиву:Параметр эль функции связующей

.directive('confirmOnExit', function() { 
    return {link: function ($scope, elem, attrs) { 
      window.onbeforeunload = function() { 
       if ($scope.contextForm.$dirty) { 
        return "Unsaved data detected."; 
       } 
      } 

     } 
    }; 
} 
) 

Как вы можете видеть, что директива не очень хорошо написана, как он обращается непосредственно к форме «contextForm».

Что я хотел сделать, это что-то немного более общий (так что я мог бы также использовать его в других формах):

.directive('confirmOnExit', function ($window) { 
    return {link: function ($scope, elem, attrs) { 

      // Make sure code is only executed if directive is place on a form 
      // Should I even do this here?? 
      if (elem[0].tagName == "FORM") { 

       var form = elem[0]; 

       $window.onbeforeunload = function() { 

       if (form.className.indexOf("ng-dirty") > -1) { 
        return "Unsaved data detected."; 
       } 
      } 

     } 
    }; 
} 
) 

Вы заметите, что код все еще довольно некрасиво, так как form.hasClass («ng-dirty») или form. $ dirty() не работает ... Я также думаю, что доступ к элементу [0] неверен ...

Я очень благодарен за помощь!

Спасибо!

ответ

2

От AngularJS form doc:

Если указано имя атрибута, контроллер формы публикуется на текущую область под этим именем.

Таким образом, вы можете получить доступ к этому контроллеру с помощью $eval на name атрибута:

.directive('confirmOnExit', function() { 
    return { 
     link: function ($scope, elem, attrs) { 
      var formCtrl = $scope.$eval(attrs.name); 
      window.onbeforeunload = function() { 
       if (formCtrl.$dirty) { 
        return "Unsaved data detected."; 
       } 
      } 
     } 
    }; 
}); 
2

Вы должны полагаться на FormController (http://docs.angularjs.org/api/ng.directive:form.FormController)

Так что вы можете сделать:

  1. Добавить "require: '^ngForm'" запросить форму контроллера в качестве параметра вы связывая функцию
  2. Добавить другой параметр в ваше связывание функция (вид formCtrl)
  3. formCtrl.$dirty

Если вам непонятно, создайте пример plunker с директивой, и я попытаюсь внести на него эти изменения.

Смежные вопросы