Я начинаю с угловатым, но втираюсь в несколько более продвинутые углы, чтобы обеспечить ему необходимые функции.Угловые динамические полиморфные директивы
Конкретно мне нужно:
- делает последовательность виджетов различных типов с каждым реализованным в качестве независимых угловых директив
- типа виджета определяется из данных, а не по разметке
- виджетов каждый определяется в отдельном файле
- задает область действия директивы для данных для этого экземпляра виджета
Я думаю, что я решил требования, описанные ниже, и реализованный в http://jsfiddle.net/cUTt4/5/
Вопросы:
- это правильно, лучшая практика, и достаточно быстро?
- Любые улучшения, которые я должен добавить?
- Было бы лучше, если бы директивы виджета не имели явной ссылки {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