如何根据条件动态注入 angular 1.5 组件?

How to inject angular 1.5 components dynamically, based on a condition?

这是我的一小段代码:

<div class="list-group">
    <div class="list-group-item list-group-item-default text-center">{{p.Name}}</div>
    <div class="list-group-item">
        <!--Using bootstrap form-group for each field -->
        <div ng-repeat="f in p.Fields">

            <!--Here I want to inject components dynamically-->
            <!--<text-field></text-field>-->

        </div>
    </div>
</div>

<div ng-repeat="f in p.Fields">...</div>中我需要注入相应的组件,比如<text-field><text-area-field>等... 动态,基于一个条件:

if (f.type == "TEXTFIELD") >>> 注入 <text-field>组件
if (f.type == "TEXTAREAFIELD") >>> 注入 <text-area-field>component

等等...

最好的方法是什么?谢谢。

你可以这样操作:

<div class="list-group">
    <div class="list-group-item list-group-item-default text-center">{{p.Name}}</div>
    <div class="list-group-item">
        <!--Using bootstrap form-group for each field -->
        <div ng-repeat="f in p.Fields">

            <div ng-if="f.type == 'TEXTFIELD'">
               <text-field></text-field>
            </div>

            <div ng-if="f.type == 'TEXTAREAFIELD'">
               <text-area-field></text-area-field>
            </div>

        </div>
    </div>
</div>

这取决于您打印到页面的输入是否需要被 angular 也使用(ng-model)。

如果是这样,您需要 $compile 提供程序。

我建议制定一个指令来处理这个问题。你可以:

 <div ng-repeat="f in p.Fields">
      <x-your-directive params={{f}}>
 </div>

在您的指令中,您将通过 attrs.params

接收要解析的数据

然后您需要自己注入 $compile,就像注入 $scope、服务等一样

然后您可以使用 angular.element(即 jQLite)应用新输入。

这样做,以及 angular 理解新创建的 DOM 元素,这就是您使用 $compile.

的地方

$compile 会告诉 angular 重新动态解析元素。

示例:

angular.module('your_module', []).directive('yourDirective', ['$scope', '$compile', function($scope, $compile) {
    return {
        restrict: 'E',
        controllerAs: 'YourCtrl',
        controller: [function() {}],
        link: function ($scope, element, attrs, ctrl) {
            // Switch case on attrs.params (which is f in p.Fields)
            if (attrs.params === 'TEXTFIELD') {
                element.html($compile('<input type="text"/>')($scope))
            }
        }
    }
}])

这很酷的一点是,它也适用于指令(打印部分)。因此,如果你想动态地添加指令到你的DOM,你可以:)