2015-03-30 2 views
2

Я немного смущен тем, как значения записываются в директиве в AngularJS. У меня есть следующий код, который очень хорошо работает при проверке того, идентичны ли 2 пароли в полях вводаЗначение атрибута ngModel атрибута не определено при просмотре

[HTML]

<div class="form-group"> 
       <label for="profileSecret" class="control-label col-sm-4">WPA2 Password:</label> 
       <div class="col-sm-6"> 
        <input type="password" name="profileSecret" class="form-control" ng-model="profile.secret"> 
       </div> 
       </div> 

       <div class="form-group"> 
       <label for="profileSecret" class="control-label col-sm-4">WPA2 Password (Confirm):</label> 
       <div class="col-sm-6"> 
        <input type="password" name="profileSecretRepeat" class="form-control" is-valid-psk="profile.secret" ng-model="profile.secretRepeat"> 
       </div> 
       </div> 

[Работали УД]

.directive('isValidPsk',function(){//camel case normalize, remember 
     return { 
      restrict:'A', 
      require: 'ngModel', 
      link: function(scope, elt, attr, ctrl){ 
       scope.$watchGroup([attr.isValidPsk,attr.ngModel],function(newVal, oldVal){ 
        validate(newVal[0],newVal[1]); 
       }); 

       var validate = function(value1, value2){ 
        if (typeof value1 == 'undefined' || typeof value2 == 'undefined'){ 
         ctrl.$setValidity('isEqualPwd',false); 
        } 
        else{ 
         var res = value1 != '' && value1 == value2 && (value1.length >= 8 && value1.length <= 64); 
         ctrl.$setValidity('isEqualPwd',res); 
        } 
       }; 
      } 
     }; 
    }) 

Приведенный выше код работает отлично, как я ожидал, но мне интересно, почему следующий код не получает то, что я ожидал, attr.ngModel просто дал мне «неопределенный» вместо фактического значения «profile.secretRepeat»?

[УД не работает]

.directive('isValidPsk',function(){//camel case normalize, remember 
     return { 
      restrict:'A', 
      require: 'ngModel', 
      scope: { 
       isValidPsk: '=', 
      }, 
      link: function(scope, elt, attr, ctrl){ 
       scope.$watchGroup(['isValidPsk',attr.ngModel],function(newVal, oldVal){ 

        console.log(newVal[0]); 
        //validate(newVal); 
        console.log(newVal[1]); //>> why this is undefined?? 
       }); 

Большое спасибо за помощь!

+1

сфера. $ WatchGroup ожидает контекстными переменную, которая содержит некоторое значение и может быть изменено каким-либо внешним воздействием. Вы передаете постоянное строковое значение, поэтому возникает ошибка. –

+0

@ TechMa9iac Спасибо за ответ, но я полагаю, что attr.ngModel не является строковым значением? – user2499325

ответ

1

Поскольку ваша 1-я директива не содержит изолированного объема, вы получаете как обновленные значения внутри вас. scope.$watchGroup функция. Но в вашем измененном коде вы выделили область внутри своей директивы, а это значит, что текущая область не наследуется от области содержимого. Для этого вам нужно явно указать область parent из директивы.

Код

scope.$watchGroup(['isValidPsk','$parent.' + attr.ngModel], function(newVal, oldVal) { 
    console.log(newVal[0]); 
    //validate(newVal); 
    console.log(newVal[1]); 
}); 
+0

Если я правильно понял, если я не укажу область действия, область действия директивы будет разделять информацию о родительской области, поэтому я могу наблюдать за обеими значениями, с другой стороны, если я поставлю «область», в директиве создается изолированная область, и в директиве можно читать только значение, указанное в этой области, поэтому для тех, которые я не указывал в объекте области видимости, я ничего не могу получить. – user2499325

+0

@ user2499325 да, если вы удалите изолированную область, вещь начнет работать как раньше ... но если вы хотите остаться с изолированной областью, тогда вам нужно использовать '$ parent.', чтобы указать родительскую переменную, вы пробовали мои выше решения? –

+1

Да, я уже пробовал, отлично работает, спасибо за исправление и разъяснение! – user2499325

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