Angular с использованием ng-модели с выражением в шаблоне директивы
Я хочу использовать атрибут ng-model в пользовательском элементе. Проблема в том, что мне нужно установить ng-модель с выражением:
ng-model="{{anyVariable}}"
Проблема в том, что я всегда получаю сообщение об ошибке, как только я добавлю выражение в атрибут ng-model в свой шаблон:
Error: Syntax Error: Token 'x.name' is unexpected, expecting [:] at column 3 of the expression [{{x.name}}] starting at [x.name}}].
at Error (<anonymous>)
at throwError (http://localhost:9000/public/javascripts/angular.js:5999:11)
at consume (http://localhost:9000/public/javascripts/angular.js:6037:7)
at object (http://localhost:9000/public/javascripts/angular.js:6327:9)
at primary (http://localhost:9000/public/javascripts/angular.js:6211:17)
at unary (http://localhost:9000/public/javascripts/angular.js:6198:14)
at multiplicative (http://localhost:9000/public/javascripts/angular.js:6181:16)
at additive (http://localhost:9000/public/javascripts/angular.js:6172:16)
at relational (http://localhost:9000/public/javascripts/angular.js:6163:16)
at equality (http://localhost:9000/public/javascripts/angular.js:6154:16)
Используемый код:
function addFormFieldDirective(elementName, template) {
app.directive(elementName, function() {
return {
restrict: "E",
scope: {},
replace: true,
// adds some extra layout
template: buildFormTemplate(template),
link: function(scope, elm, attrs) {
scope.x = attrs;
}
};
});
}
addFormFieldDirective("textfield", '<input id="{{x.id}}" ng-model="{{x.name}}" type="text" name="{{x.name}}" value="{{x.value}}" />');
Ответы
Ответ 1
Я не мог найти способ передать выражение в ng-model
в шаблоне директивы.
Следующее решение создает изолированную модель в директиве, а директива controller
динамически создает имя свойства в объекте модели основного контроллера и наблюдает за тем, чтобы изолированная модель передавала обновления основной модели:
app.directive("textfield", function() {
return {
restrict: "E",
scope: {},
replace: true,
controller:function($scope,$attrs) {
$scope.x=$attrs;
$scope.$watch('directiveModel',function(){
$scope.$parent.myModel[$attrs.name]=$scope.directiveModel;
}) ;
$scope.directiveModel=$attrs.value;
},
template: buildFormTemplate('<input ng-model="directiveModel" id="{{x.id}}" type="text" name="{{x.name}}" value="{{x.value}}" />');
};
});
демонстрация Plunkr
Ответ 2
Попробуйте следующую версию:
.directive('myDir', function() {
return {
restrict: 'EA',
scope: {
YYY: '=ngModel'
},
require: 'ngModel',
replace: true,
template: '<input ng-model="YYY" />'
};
});