OK это надуманный пример, но ...AngularJS Доступ Связанный контроллер Атрибут Из директивы
Скажем, у меня есть контроллер, как это:
app.controller('TestCtrl', function() {
this.testString;
this.otherString;
});
И у меня есть шаблон:
<div ng-controller='TestCtrl as test'>
<input demo type='text' ng-model='test.testString'>
{{test.otherString}}
</div>
А то у меня есть директивы, как это:
app.directive('demo', function() {
return {
require:'ngModel',
link: function(scope, elem, attrs, ctrl) {
scope.$watch(attrs.ngModel, function(newVal) {
/* How do I get otherString without knowing the controller alias?
This works but is not good practice */
scope.test.otherString = newVal + ' is cool!';
/* This doesn't work, but would if the property was in scope
instead of the controller */
scope[attrs.demo] = newVal + ' is cool!';
});
}
}
});
Как получить другую строку, не зная псевдоним контроллера? Я мог бы просто разбить attrs.ngModel, чтобы получить его, но есть ли «угловой» способ получить собственность?
EDIT
Хотя этот пример не точно отражают проблемы, которые я имел с моим реальным сценарием, я выяснить, как получить свойство контроллера в функции связи, что позволяет мне обновить модель :
link: function(scope, elem, attrs, ctrl) {
var otherString = scope.$eval(attrs.demo);
scope.$watch(attrs.ngModel, function(newVal) {
otherString = newVal + ' is cool!';
}
}
Директивы действительно все о манипуляциях с DOM и не должны напрямую привязываться к контроллеру. Я понял, что это надуманный пример, но похоже, что ваша директива должна быть просто дочерним контроллером, поскольку она больше связана с областью действия, чем с DOM. – Bryant