fxc*_*xck 9 jquery datagrid inline-editing angularjs angularjs-directive
我正在尝试使用angularjs找到内联编辑的最佳方法.就我而言,它是一种带有"编辑"按钮的数据网格.所以它在ng-repeat里面.
我所见过的人在同一行中同时拥有实际数据和编辑输入,编辑输入被隐藏并在点击编辑按钮时显示.
但这似乎不对.在我看来,这是一个无用的DOM.
所以我觉得做这样的事情会更好.你点击编辑按钮,这将有一个指令,这将1)隐藏<td>数据2)找到按钮的父亲,应该是<tr>,并注入模板3)保存删除那些编辑<td>和<td>再次显示数据.
所以我开始制作指令,在我有element.click()功能的内部
// found the parent
var parent = element.closest('tr');
// found all the data tds
var tds = parent.find('td');
// hidden them
tds.hide();
Run Code Online (Sandbox Code Playgroud)
现在这是问题,接下来我想做这样的事情
// append input with editing tds into parent
parent.append('<td><input type="text" ng-model="entry.name" /> {{entry.name}} </td>');
Run Code Online (Sandbox Code Playgroud)
但是它会不会绑定甚至解析{{}}它会不会?我必须使用什么方法而不是jquery的追加?
关于指令的文件说明了这一点
template element - 声明指令的元素.仅对元素和子元素进行模板转换是安全的.
所以我不能在element.parent()上使用模板转换
如果我做了指令就行了<tr>,即使我做了,我会改变我的整体<tr>,这意味着我失去了原来的模板,我必须有另一个指令或某些东西,将它转换回原始状态..不是吗?
因为这个问题看起来很流行..首先,我最初担心每次ng重复迭代渲染额外的元素是没有根据的,因为1)你可以使用ng-if,这意味着在条件成立之前它根本不会被渲染2)你可以像我想的那样附加一个模板,然后只是使用$compile它会很好地工作,它绝对不会"昂贵",因为你只是为了一个元素.有许多方法可以解决这个问题,但是ng-if是最简单的,如果supermasher的方式不适合你,那就是.
sup*_*her 11
注入一个新模板是一种非常昂贵的处理方式,特别是如果你的内联编辑器有很多实例.
有很多方法可以做到这一点,但最干净(也是最简单)的方法是使用相同的元素来编辑和显示数据,并使用指令切换它的CSS以改变它在两种状态下的显示方式,如下所示:
myApp.directive('inlineEdit', function () {
return function (scope, element, attrs) {
element.bind('click', function () {
if (element.hasClass('inactive')) {
element.removeClass('inactive');
} else {
element.addClass('inactive');
$(element).blur()
}
});
};
Run Code Online (Sandbox Code Playgroud)
});
看看这个小提琴,找到一个完整的例子:http://jsfiddle.net/3EaY8/.
| 归档时间: |
|
| 查看次数: |
5354 次 |
| 最近记录: |