我是Angular的初學者,但我正在探索一些稍微更先進的角落以確保它具有我需要的功能。角度動態多態指令
具體我需要:
- 呈現與每個作爲一個獨立的角指令
- 微件類型是從數據確定,而不是由標記
- 小部件實現的不同類型的窗口小部件的一個序列各自定義在單獨的文件中
- 將指令的範圍設置爲該小部件實例的數據
我想我已經解決了以下說明,並在http://jsfiddle.net/cUTt4/5/
問題實施的要求:
- 這是正確的,最佳實踐,和相當快?
- 我應該添加哪些改進?
- 如果widget指令沒有顯式引用{item:'='}來獲得它們的隔離範圍,但它們的子範圍應該由renderform指令構建,那會更好。我怎麼做?
我的解決辦法: HTML (注角模板腳本這裏因的jsfiddle的限制)
<div ng-app="myApp">
<script type="text/ng-template" id="widget-type-a">
<div>
<label>{{ item.label}} </label>
<input type="text" ng-model="item.val" >
</div>
</script>
<script type="text/ng-template" id="widget-type-b">
<div>
<label>{{ item.label}}</label>
<input type="text" ng-model="item.val" >
</div>
</script>
<div ng-controller="FormCtrl">
<renderform></renderform>
</div>
</div>
main.js:
var app = angular.module('myApp', []);
function FormCtrl($scope) {
items = [
{
type: 'widget-type-a',
label : 'Widget A instance 1',
val: 1
},
{
type: 'widget-type-b',
label : 'Widget B instance 1',
val : 2
},
{
type: 'widget-type-a',
label : 'Widget A instance 2',
val : 3
}
];
$scope.items = items
}
app.directive('renderform', function($compile) {
function linkFn(scope, element) {
var item,
itemIdx,
templStr = '',
newParent,
data,
newEl;
newParent = angular.element('<div></div>')
for(itemIdx in scope.items) {
item = items[itemIdx];
templStr += '<div ' + item.type + ' item="items[' + itemIdx + ']"></div>';
}
newEl = angular.element(templStr);
$compile(newEl)(scope);
element.replaceWith(newEl);
}
return {
restrict: 'E',
link:linkFn
};
});
app.directive('widgetTypeA', function() {
return {
restrict: 'A',
templateUrl: 'widget-type-a',
scope: { item: '=' }
};
});
app.directive('widgetTypeB', function() {
return {
restrict: 'A',
templateUrl: 'widget-type-b',
scope: { item: '='}
};
});
你的jsfiddle似乎丟幾個錯誤。 –
謝謝Michal,我沒有保存加載選項。上面的鏈接現在應該在FF/Chrome中運行。 – pwray