2013-12-10 3 views
0

Я пытаюсь создать пользовательский компонент текстового поля электронной почты, который имеет два поля. Для этого у меня есть этот шаблон:AngularJS: привязка директивы

<div class="custom"> 
    <div class="username" contenteditable="true"></div> 
    <div class="domain">@{{ domainValue }}</div> 
</div> 

Так что я могу ссылаться на директиву, которая вызывает этот шаблон, как:

<div ng-custom-txt></div> 

Из директивы Я хочу, чтобы иметь возможность передавать различные виды значений (домены) из модели под названием «нг-domaindata», как:

<div ng-domaindata="mydomain1.com" ng-custom-txt></div> 

Мой вопрос, как я могу связать директивы с полем «домен», который находится в шаблоне?

Я пытался использовать этот подход, но без успеха на всех:

Шаблон: customtemplate.html

<div class="custom"> 
    <div class="username" contenteditable="true"></div> 
    <div class="domain">@{{ domainValue }}</div> 
</div> 

Page

<div ng-domaindata="mydomain1.com" ng-custom-txt></div> 
<div ng-domaindata="mydomain2.com" ng-custom-txt></div> 

Директива

app.directive('ngCustomTxt', function() { 
    return { 
    restrict: 'A', 
    require: '^ngModel', 
    templateUrl: 'customtemplate.html', 
    link: function(scope, element, attrs, ctrl) { 
     scope.$watch(attrs.ngDomaindata, function (newValue){ 
     scope.domainValue = newValue; 
    } 
    } 
    } 
}); 

Очевидно, что это не сработает, так как я не могу отличить эти два элемента, может ли кто-нибудь помочь мне с этим?

+0

Просто быстрый наконечник. Избегайте использовать свою собственную директиву с префиксом ng. –

ответ

0

Создать область действия для этой директивы. Кажется, что директива получает общий объем. Объявление области действия заставит получить новый экземпляр области.

Кроме того, наблюдатели выполняются, когда экземпляр, где был создан. В вашем случае это значение не задано для значения scope.domainData.

Постарайтесь проверить, действительно ли newValue, или использовать функцию $ observ.

app.directive('customTxt', function($parse) { 
    return { 
    restrict: 'A', 
    templateUrl: 'customtemplate.html', 
    scope : {}, 
    link: function(scope, element, attrs, ctrl) { 
     scope.domainValue = attrs.domaindata; 
     scope.$watch(attrs.domaindata, function (newValue){ 
      console.log('This code will execute when the instance where created. Getting a undefined newValue variable: ', newValue); 
      // verifying if the value is valid to set to the scope. 
      if (newValue != null) { 
       scope.domainValue = newValue; 
      } 
     }); 
    } 
    }; 
}); 

Working plunker

+0

Спасибо большое! Он приближается, но я стараюсь перейти на следующий уровень, и я чувствую, что этот подход не сработает. Я объясняю себя: Значение модели является динамическим, обновляется другим контроллером и сохраняется в общей области видимости, поэтому мне нужно каким-то образом привязать значение, которое находится в общей области видимости к этому, которое является локальным. С этим решением у меня нет доступа к общему объему, как это можно сделать? – DreaMTT

+0

Успокойтесь, посмотрите в этом плункер и посмотрите, помогает ли: http://plnkr.co/edit/eAFdwi4jztR197wo0QdO?p=info –

+0

Большое спасибо Deividi! Теперь он становится еще ближе! То, что мне нужно в точности, - это короткое двунаправленное связывание между областями, я только что отредактировал ваш плункер, чтобы показать вам именно то, что мне нужно, пожалуйста, посмотрите: http://plnkr.co/edit/IBpyZbCV7pOB25oZSYD7?p=preview So , похоже, что работает, но когда я хочу обновить один из доменов из глобальной области, нажав «Изменить значение», он не обновляет локальную область. Правильно? – DreaMTT

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