0

我编写了一个名为 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 工作正常,但不在我的包含中。

请问有什么想法吗?

4

1 回答 1

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 中的元素。调试 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)
});

谢谢

于 2015-07-13T07:38:22.493 回答