1

我正在尝试编写一个指令,该指令为表单中的字段发出所有 HTML - 包装 div、标签、输入等。对于某些字段,我想使用Angular UI Bootstrap 的“typeahead”指令

我首先尝试在模板中使用 ng-attr-typeahead='{{myTypeahead}}'。我预计,在未设置“myTypeahead”的字段上,不会有“typeahead”属性的证据。相反,在指令处理期间,该属性以未定义的值出现在属性列表中,并且 typeahead 指令被调用并立即爆炸,因为它的输入未定义。

然后我尝试使用像这样的后编译函数:

    compile: function compile(tElement, tAttrs, transclude) {
        return function postLink(scope, iElement, iAttrs, controller) {
            if ( iAttrs.eiTypeahead !== undefined ) {
                var me = $(iElement);
                var input = $("input", me);
                input.attr("typeahead", iAttrs.eiTypeahead);
                $compile(input[0]);
            }
        }
    }

这会将“typeahead”属性放在输入元素上,但不会调用 typeahead 指令。

我希望这可能是其他一些帖子的副本,但我没有搜索正确的词来找到它。

4

1 回答 1

1

当您向指令元素添加其他指令时,应该从指令的compile函数中添加这些指令,并且您可以postLink从编译返回的函数中编译指令元素。

代码

compile: function compile(tElement, tAttrs, transclude) {
    if ( iAttrs.eiTypeahead !== undefined ) {
       var me = $(iElement);
       var input = $("input", me);
       input.attr("typeahead", iAttrs.eiTypeahead);
    }
    return function postLink(scope, iElement, iAttrs, controller) {
        $compile(input[0]);
    }
}

您可以参考这个答案以获得更好的解释

于 2015-06-27T18:51:45.863 回答