2013-01-09 12 views
3

我想基於一個模板,它又有一些動態屬性動態地生成一個表單。Angularjs指令:如何通過動態id找到一個元素,並修改模板

我越來越近,但無法檢索容器元素。

這是指令:

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); 
    } 
} 

}); 

控制器:

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

    $scope.FieldData = {}; //{fieldname: fielddata} 
} 

HTML:

<div ng-controller="MyCtrl"> 
     <my-directive data-ng-repeat="field in Fields" data-field-info="field"> 
    </my-directive> 
</div> 

基本上我有字段描述符對象,並且需要生成基於該一個形式。 我不太確定如何引用一個容器對象 - 模板是否在鏈接之前編譯?

此外,我實際上使用templateUrl,如果這很重要。

這裏是一個fiddle

回答

5

您需要使用$compile編譯爲html模板。另外,您可以使用link函數中的element訪問模板中的外部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); 
     } 
    } 
}); 

請參閱jsfiddle

+0

+1但是,未來的讀者應該注意到element.find()是遞歸的,所以如果模板比這更復雜,你需要使用另一種方法(如element.children())。 –

+0

更改了它。關鍵是在鏈接功能 – asgoth

+0

中使用'元素'我認爲你的第一種方式是最好的在這種情況下。附註:我不認爲jqLit​​e支持象'jQuery那樣''element.children'中的搜索值,但我可能在這裏是錯誤的。 –

相關問題