Я пытаюсь найти лучший подход к встроенному редактированию с помощью angularjs. В моем случае это своего рода сетка данных с кнопкой «редактировать». Так что это внутри ng-repeat.
То, что я видел, люди делают, так это имеют как фактические данные, так и редактируемые входные данные в одной строке, при этом редактируемые входные данные скрыты и отображаются при нажатии кнопки редактирования.
Но это не кажется правильным. На мой взгляд, это бесполезный DOM.
Поэтому я подумал, что мне лучше сделать что-то подобное. Вы нажимаете кнопку редактирования, которая будет иметь директиву, которая 1) скроет <td>
с данными 2) найдет родителя кнопок, который должен быть <tr>
, и вставит в него шаблон 3) при сохранении удалите эти изменения <td>
s и снова показать данные <td>
s.
Итак, я начал с создания директивы, внутри у меня была функция element.click()
, которая
// found the parent
var parent = element.closest('tr');
// found all the data tds
var tds = parent.find('td');
// hidden them
tds.hide();
Теперь вот проблема, затем я подумал о том, чтобы сделать что-то вроде этого
// append input with editing tds into parent
parent.append('<td><input type="text" ng-model="entry.name" /> {{entry.name}} </td>');
Но тогда он не будет связывать или даже анализировать {{}}, не так ли? Какой метод мне нужно использовать вместо добавления jquery?
Документ о директивах говорит об этом
элемент шаблона — элемент, в котором была объявлена директива. Безопасно выполнять преобразование шаблона только для элемента и дочерних элементов.
Поэтому я не могу использовать преобразование шаблона для element.parent()
Помогло бы, если бы я сделал директиву на <tr>
, и даже если бы я это сделал, я бы тогда преобразовал всю свою <tr>
, что означает, что я потерял исходный шаблон, и мне нужно было бы иметь другую директиву или что-то, что преобразовало бы его обратно в исходное состояние .. не так ли?
Редактировать
Поскольку эти вопросы кажутся довольно популярными... во-первых, мое первоначальное беспокойство по поводу рендеринга дополнительного элемента с каждой итерацией ng-repeat необоснованно, потому что 1) вы можете использовать ng-if, что означает, что он вообще не будет отображаться, пока условие не будет выполнено 2) вы можете добавить шаблон, как я и предполагал, а затем просто использовать $compile
, и он будет работать нормально, он определенно не будет «дорогим», поскольку вы делаете это только для одного элемента. Есть много способов подойти к этому, но ng-if самый простой, если вам не подходит способ supermasher, т.е.