2013-02-15 3 views
1

Я пытаюсь написать настраиваемую директиву, которая применяется к входному элементу, для которого требуется ngModel, и который добавляет парсер и функцию форматирования для ngModel.Угловая входная форматера/директива парсера и интерполированные атрибуты?

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу передать интерполированные значения в директиву, одновременно поддерживая привязку ngModel. Например, я хочу, чтобы иметь возможность использовать свою директиву в одном из двух способов:

проходя буквенные аргументы:

<input ng-model="foo" my-directive="120" /> 

или передачи интерполированных аргументы из текущей области:

<input ng-model="foo" my-directive="{{bar}}" /> 

... 
function MyCtrl($scope) { 
    $scope.bar = "120"; 
} 

Если Я прочитал аргумент атрибутов функции ссылки в моем определении директивы, я могу получить значение атрибутов.myDirective в первом использовании, но во втором использовании значение myDirective не определено.

Теперь, если добавить изолированную сферу к определению директивы:

scope: { myDirective: '@' } 

Тогда scope.myDirective определяется и интерполированное в сценариях выше, но теперь ngModel сломана. Мои функции парсера/форматирования передаются неопределенными для их входных аргументов. Что происходит, и как я могу реализовать поведение, которое я хочу?

директива:

module.directive('myDirective', function() { 
     return { 
      restrict: 'A', 
      require: 'ngModel', 
      replace: false, 
      link: function (scope, elm, attrs, ctrl) { // attrs.myDirective not interpolated 
+0

Можете ли вы опубликовать код для своей директивы? Моя догадка заключается в том, что вы не можете использовать ключ 'require', который даст вам доступ к контроллеру' ngModel'. – satchmorun

ответ

2

При добавлении изолят сферы, вы создаете совершенно новые дочерний объем, который не наследует от объема со значением по ngModel «s в нем. Вот почему ваши парсеры и составители становятся неопределенными.

Кроме того, в вашем примере, чтобы получить при значении bar, вам не нужно его в фигурные скобки:

<input ng-model='foo' my-directive='bar' /> 

И в вашей связывающей функции:

link: function(scope, element, attr, ctrl) { 
    attr.myDirective == 'bar'. 
    scope.$eval(attr.myDirective) == // whatever the value of 'bar' is in the current scope 
} 

Так вы не требуется область изоляции. Просто используйте scope.$eval, чтобы оценить выражение, переданное вашей директиве.

Here's a quick fiddle.