Angularjs指令:如何通过动态id查找元素,并修改模板

Evg*_*eni 3 angularjs

我正在尝试基于模板动态生成表单,而模板又具有一些动态属性.

我越来越近了,但是在检索容器元素方面遇到了麻烦.

这是指令:

myApp.directive('myDirective', function () {
    return {
    template: "<div> <label>{{Field.Name}} <div id='{{Field.Name}}_Container'></div> </label></div>",
    replace: true,
    restrict: 'AE',
    scope: {
        Field: "=fieldInfo",
        FieldData:"="
    },
    link: function (scope, element, attr) {
        var input = "<input type='" + scope.Field.Type + "' data-ng-model='FieldData[" + scope.Field.Name + "]' />";
        var inputEl = angular.element(input);
        var container = angular.element("#" + scope.Field.Name + "_Container"); // Doesn't work
        container.append(inputEl);
    }
}

});
Run Code Online (Sandbox Code Playgroud)

控制器:

function MyCtrl($scope) {
    $scope.Fields = [
      { Name: "field1", Type: "text", Data:null },
      { Name: "field2", Type: "number", Data:null }
    ];

     $scope.FieldData = {}; //{fieldname: fielddata}
}
Run Code Online (Sandbox Code Playgroud)

HTML:

<div ng-controller="MyCtrl">
      <my-directive data-ng-repeat="field in Fields" data-field-info="field">
    </my-directive>
</div>
Run Code Online (Sandbox Code Playgroud)

基本上我有字段描述符对象,需要根据它生成表单.我不太确定如何引用容器对象 - 在链接之前必须编译模板吗?

另外,我实际上正在使用templateUrl,如果这很重要的话.

这是一个小提琴.

asg*_*oth 5

你需要使用$ compile编译到html模板.此外,您可以elementlink函数中使用div模板中的外部访问.

var myApp = angular.module('myApp', []);

myApp.directive('myDirective', function ($compile) {
    return {
        template: "<div> <label>{{Field.Name}} <div id='{{Field.Name}}_Container'></div> </label></div>",
        replace: true,
        restrict: 'AE',
        scope: {
            Field: "=fieldInfo",
            FieldData:"="
        },
        link: function (scope, element, attr) {
            var input = "<input type='" + scope.Field.Type + "' data-ng-model='FieldData[" + scope.Field.Name + "]' />";
            var html = $compile(input)(scope);
            element.find('div').append(html);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

jsfiddle.