我写了一个名为lobInclude的指令,我想要与ngInclude相同但没有范围:
.directive("lobInclude", ["$templateRequest", "$compile", function($templateRequest, $compile) {
return {
restrict: "A",
scope: false,
compile: function() {
return {
pre: function(scope, elem, attrs) {
var toObserve = "lobInclude";
attrs.$observe(toObserve, function(value) {
value = scope.$eval(value);
$templateRequest(value, true).then(function(response) {
if (angular.isDefined(attrs.replace))
elem.replaceWith($compile(angular.element(response))(scope));
else
elem.append($compile(angular.element(response))(scope));
});
});
},
post: function() { }
};
}
}
}]);
一切似乎都没问题,但使用我的指令时ng-Messages无法正常工作,你可以在这里看到一个例子:http://codepen.io/jros/pen/jPxmxj?editors=101
在代码笔中,我有一个带有输入和我的指令的表单,其中包含一个包含其他输入的脚本ng-template。
第一个输入中的ng-messages工作正常但不在我的包含中。
有什么想法吗?
答案 0 :(得分:0)
问题在于编译所请求的模板:
$templateRequest(value, true).then(function(response) {
if (angular.isDefined(attrs.replace))
elem.replaceWith($compile(angular.element(response))(scope));
else
elem.append($compile(angular.element(response))(scope));
});
安全性是:创建一个元素,编译并添加/替换DOM中的元素。 debuging angular.js我可以看到NgModelDirective是与FormDirective控制器通信以设置$ pristine,$ touch,... NgModelDirective有一个'^?form'作为需要与父表单进行通信。 好吧,当我编译元素时,模板没有父表单,因为它没有包含在DOM中。 ngModel无法找到祖先形式,也无法设置$ error,$ pristine,$ touch,...
解决方案是将元素添加到DOM然后编译它:
$templateRequest(value, true).then(function(response) {
var responseElem = angular.element(response);
if (angular.isDefined(attrs.replace))
elem.replaceWith(responseElem);
else
elem.append(responseElem);
$compile(responseElem)(scope)
});
由于