【问题标题】:How do I conditionally add an attribute directive to a child directive?如何有条件地将属性指令添加到子指令?
【发布时间】:2023-04-05 23:56:01
【问题描述】:

我有一个指令,我想将一个显示值传递给它,它有条件地编译一个内部指令的属性指令。

例如,

<a-directive show-it="showIt"></a-directive>

如果showIt 为真,我希望将其替换为

<a-directive show-it="showIt">
  <inner-directive value="[some expression]">
    <div>[some expression evaluated]</div>
  </inner-directive>
</a-directive>

在哪里

  • [some expression] 需要被解释(我猜它需要是$compile'd,但我不确定)
  • inner-directive 在它自己的模板文件中,并且有自己的链接功能,可以设置一些东西

否则,如果showIt 为假,我希望将其替换为

<a-directive show-it="showIt">
  <inner-directive></inner-directive>
</a-directive>

此处显示了一个示例:

http://jsbin.com/uBIceCi/29/edit$compile 如果您取消注释,我会创建一个无限循环 - 在 prelink 和 postlink 函数中都尝试过)。

http://jsbin.com/uBIceCi/7/edit(旧示例)

更新

我的实际应用是我想有条件地将typeahead(需要编译)添加到我的内部生成指令中。即,我有一个

包装指令 (a-directive) 和一个 指令 (inner-directive),我想根据表单上的属性在输入指令中动态添加 typeahead 属性指令指令。

有什么想法吗?

【问题讨论】:

  • 我想你可以通过我的回答解决你的问题。

标签: javascript angularjs angularjs-directive angularjs-scope


【解决方案1】:

您可以在指令的链接功能中选择所需的模板,如下所示

var app = angular.module('app', []);
app.controller('MainCtrl', function ($scope) {
    $scope.showIt = false;
})
app.directive('aDirective', function ($compile) {
    return {
        restrict: 'EA',
        link: function (scope, element, attrs) {
            var template1 = '<div>template1</div>';
            var template2 = '<div>template2</div>';
            if (scope.showIt) {
                element.append($compile(template1)(scope));
            } else {
                element.append($compile(template2)(scope));
            }
        },
        scope: {
            showIt: '='
        }
    }
});

在你看来:

<div ng-app="app" ng-controller="MainCtrl">
    <a-directive show-it="showIt"> </a-directive>
</div>

【讨论】:

    【解决方案2】:

    两件事:

    1. 关于您的问题:您可以在 a-directive 的链接功能中查看“shoe-it”值并将连接内容附加到元素:

        var content = scope.showIt ? '<inner-directive attr-directive="hello"></inner-directive>'
                                   : '<inner-directive ></inner-directive>';
        element.append($compile(content)(scope));
      

    如果你在内部指令中这样做,你会得到一个无限循环,因为指令会自己编译,所以实际上链接函数会调用自己。

    1. 您遇到的另一个问题是 inner-directive 和 attr-directive 都尝试更改模板,因此您收到以下错误:

    多个指令 [innerDirective, attrDirective] 要求 模板:

    所以你应该决定其他指令应该做什么。这是一个例子:http://jsbin.com/OJACOqu/40/edit

    【讨论】:

    • 我遇到的问题要求我将属性指令添加到inner-directive(包含在模板中),因此我可以有条件地将其添加到inner-directive 而不是a-directiveattr-directive 应该只附加到容器中 - 很好!我将更新示例以使其更清晰。
    • 我已经更新了将attr-directive 更改为value 指令的示例,以使事情更加清晰。
    • 不确定我是否理解您的问题...如果您从链接函数内部添加指令,则必须在从 X 的链接函数内部调用指令 X 的 $compile 时调用 $compile 但是您会得到一个无限循环.因此,您应该从 X 外部执行此操作。在您的情况下:从 a-directive 的链接函数而不是从内部指令添加 value 指令(请参阅我的示例)
    • 好吧,在我的实际代码中,我希望inner-directive 的定义包含value。所以我想先编译inner-directive,然后插入到a-directive。基本上,我有一个表单指令(a-directive)和一个输入指令(inner-directive),我想根据表单上的属性在输入指令中动态添加typeahead属性指令。
    猜你喜欢
    • 1970-01-01
    • 2016-09-26
    • 2023-03-24
    • 1970-01-01
    • 2011-12-15
    • 2016-05-22
    • 1970-01-01
    • 2018-11-16
    • 2016-08-29
    相关资源
    最近更新 更多