0

Я использую ng-repeat и настройки модели с ним, подобное следующемуКогда я требуется контроллер ngModel, как получить доступ к свойству контроллера модели

<div ng-repeat="thing in things" ng-model="thing" my-directive> 
    {{thing.name}} 
</div> 

тогда в моей директиве это выглядит примерно так

.directive("myDirective, function() { 
    return { 
     require: 'ngModel', 
     link: function(scope, lElement, attrs, model) { 

     console.log(model.name);// this gives me 'NAN' 
     } 
    } 
}) 

Мой вопрос в том, как я могу получить доступ к значениям в модели? Я пробовал model.$modelValue.name, но это не сработало.

+0

почему это вниз проголосовали? –

ответ

2

Если вы хотите связать в области области действия, вы можете использовать '=' в изолированном. Это будет отображаться в области вашей директивы. Чтобы прочитать ng-model директиву, вы можете использовать =ngModel:

.directive("myDirective", function() { 
    return { 
     scope: { 
      model: '=ngModel' 
     } 
     link: function(scope) { 

     console.log(scope.model.name); // will log "thing" 
     } 
    } 
}); 
2
.directive("myDirective", function() { 
    return { 
     require: 'ngModel', 
     link: function(scope, lElement, attrs, model) { 

     console.log(attrs.ngModel); // will log "thing" 
     } 
    } 
}) 
0

Если директива не изолировали или сфера ребенка, то вы можете сделать это:

.directive('someDirective', function() { 
    return { 
     require: ['^ngModel'], 
     link: function(scope, element, attrs, ctrls) { 
      var ngModelCtrl = ctrls[0]; 
      var someVal; 
      // you have to implement $render method before you can get $viewValue 
      ngModelCtrl.$render = function() { 
       someVal = ngModelCtrl.$viewValue; 
      }; 
      // and to change ngModel use $setViewValue 
        // if doing it in event handler then scope needs to be applied 
      element.on('click', function() { 
       var val = 'something'; 
       scope.$apply(function() { 
        ngModelCtrl.$setViewValue(val); 
       }); 
      }); 
     } 
    } 
});