Angular.js行内编辑



我正在尝试用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的append?

关于指令的文档说这个

template element——声明了指令的元素。对元素和子元素进行模板转换是安全的

元素。

所以我不能在元素上使用模板转换。parent()

如果我在<tr>上制作指令会有帮助吗?即使我这样做了,我也会转换我的整个<tr>,这意味着我失去了原始模板,我必须有另一个指令或其他东西将其转换回原始状态。不是我?

编辑

既然这个问题似乎很受欢迎…首先,我最初担心在每次ng-repeat迭代中渲染额外的元素是没有根据的,因为1)你可以使用ng-if,这意味着它根本不会被渲染,直到条件为真2)你可以像我想的那样附加一个模板,然后只使用$compile,它就会工作得很好,它绝对不会"昂贵",因为你只是为一个元素做它。有很多很多方法可以做到这一点,但ng-if是最简单的,如果supermasher的方法不适合你,那就是。

注入一个新的模板是一种非常昂贵的方式,特别是当你有很多内联编辑器的实例时。

有很多方法可以做到这一点,但最干净(也是最简单)的是使用相同的元素来编辑和显示数据,并简单地使用指令切换它的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()
        }
    });
};

});

查看此提琴以获得完整的工作示例:http://jsfiddle.net/3EaY8/.

大家好,我知道已经有一个公认的答案了,但是我偶然发现了这个

http://vitalets.github.io/angular-xeditable/

最近,我相信它是一个非常体面的项目,处理一般的可编辑控件。

希望它能帮助到一些人。

只是把这个扔在那里,如果你使用新的ng-if指令来"隐藏"那些编辑输入和东西,"很多无用的DOM"不再是一个问题,因为ng-if根本不渲染html。

相关内容

  • 没有找到相关文章

最新更新