Как написать пользовательский элемент 'row' и 'col' для angularjs
Я пытаюсь написать немного dsl вокруг элементов сетки, описанных здесь: http://foundation.zurb.com/docs/grid.php
в основном, что я хочу сделать, это
<row>
<column two mobile-one>{{myText}}</col>
<column four centered mobile-three><input type="text" ng-model="myText"></input></col>
</row>
преобразуется в:
<div class="row">
<div class="columns two mobile-one">{{myText}}</div>
<div class= "columns four centered mobile-three"><input type="text" ng-model="myText"></input></div>
</div>
В идеале я хочу написать что-то, что может принимать произвольное вложение: row → col → row → col → row.....
У меня возникли проблемы с первым шагом вправо - вложение элементов, потому что я не могу понять, как получить дочерние элементы в другой шаблон без серьезного компрометации процесса компиляции.
var app = angular.module('lapis', []);
app.directive('row', function(){
return {
restrict: 'E',
compile: function(tElement, attrs) {
var content = tElement.children();
tElement.replaceWith(
$('', {class: 'row',}).append(content));
}
}
});
просто ничего не делает. Здесь показана неудачная попытка - http://jsfiddle.net/ZVuRQ/
Пожалуйста, помогите!
Ответы
Ответ 1
Я надеялся не использовать ng-transclude, потому что обнаружил, что добавил дополнительную область.
Вот директива, которая не использует ng-transclude:
app.directive('row', function() {
return {
restrict: 'E',
compile: function(tElement, attrs) {
var content = angular.element('<div class="row"></div>')
content.append(tElement.children());
tElement.replaceWith(content);
}
}
});
Вы можете использовать tElement.contents() вместо tElement.children().
Ответ 2
Вам вообще не нужен jquery в вашем примере (но вам нужно включить его на свою страницу /jsFiddle ):
var app = angular.module('lapis', []);
app.directive('row', function(){
return {
restrict: 'E',
template: '<div class="row" ng-transclude></div>',
transclude: true,
replace: true
};
});