Javascript 没有子作用域的自定义ng Include指令-ng消息不起作用
我编写了一个名为lobInclude的指令,我希望与ngInclude相同,但没有范围:Javascript 没有子作用域的自定义ng Include指令-ng消息不起作用,javascript,angularjs,angularjs-directive,angular-directive,ng-messages,Javascript,Angularjs,Angularjs Directive,Angular Directive,Ng Messages,我编写了一个名为lobInclude的指令,我希望与ngInclude相同,但没有范围: .directive("lobInclude", ["$templateRequest", "$compile", function($templateRequest, $compile) { return { restrict: "A", scope: false, compile: function() {
.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() { }
};
}
}
}]);
使用my指令时,所有消息似乎都正常,但ng消息无法正常工作,您可以在此处看到一个示例:
在代码笔中,我有一个带有输入的表单和我的指令,其中包括一个包含其他输入的脚本ng模板
第一个输入中的ng消息可以正常工作,但我的include中没有
有什么想法吗?问题是关于所需模板的编译:
$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中添加/替换该元素。调试angular.js我可以看到NgModelDirective是谁与FormDirective控制器通信以设置$pristine,$touch。。。NgModelDirective具有与父窗体通信所需的“^”窗体。
嗯,当我编译元素时,模板没有父表单,因为它不包括在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)
});
谢谢您为什么需要Lobbinclude?有了ng include,它就可以工作了。我需要在不创建子作用域的情况下包含模板,真实的示例更复杂,需要从外部访问模板的内容,反之亦然。