角度内联编辑表单例

时间:2016-09-06 18:03:10

标签: javascript css angularjs html-table inline-editing

我正在尝试为表格创建内联编辑(类似于angular-xeditable),但我希望一次只允许一行编辑。目前,您可以将任意数量的行置于编辑模式。

选项

  1. 在编辑模式下保留一个行列表,一旦选择了要编辑的新行,循环遍历列表并强制退出编辑模式,将请求行置于编辑模式并将其添加到列表。这基本上允许最多1行在列表中,导致一行可以一次编辑。但我没有说明如何将行从编辑模式中删除。

  2. 有一个退出编辑模式的取消按钮。所以也许使用jquery(或angular.element)获取所有取消按钮的列表并实际点击它们 - 再次强制退出行在编辑模式下,但这可能会减慢一个大表的速度,因为它将点击取消甚至不处于编辑模式的行。

  3. <table class="table table-striped">
    <thead>
      <tr>
        <th id="th-name">Name</th>
        <th id="th-age">Age</th>
        <th id="th-actions">Actions</th>
      </tr>
    </thead>
    <tr ng-repeat="contact in model.contacts">
      <td>
        <span ng-show="edit != true">{{contact.name}}</span>
        <input ng-show="edit" type="text" ng-model="model.selected.name" class="form-control" placeholder="Name">
      </td>
      <td>
        <span ng-show="edit != true">{{contact.age}}</span>
        <input ng-show="edit" type="text" ng-model="model.selected.age" class="form-control" placeholder="Name"></td>
      <td>
        <button ng-show="edit != true" id="table-edit" ng-click="edit = true; editContact(contact)" uib-tooltip="Delete" tooltip-trigger="mouseenter" tooltip-placement="bottom"><i class="fa fa-fw fa-pencil"></i></button>
        <button ng-show="edit" id="table-save" ng-click="edit = false; saveContact($index)" uib-tooltip="Delete" tooltip-trigger="mouseenter" tooltip-placement="bottom"><i class="fa fa-fw fa-floppy-o"></i></button>
        <button ng-show="edit" id="table-cancel" ng-click="edit = false; reset()" uib-tooltip="Delete" tooltip-trigger="mouseenter" tooltip-placement="bottom"><i class="fa fa-fw fa-trash"></i></button>
      </td>
    </tr>
    </table>
    

    这是一个plunker演示(允许所有行都处于编辑模式):Plnkr Demo`

    这是我想要实现的工作演示,但它正在使用模板。它根据我的喜好调用getTemplate太多次(每次运行摘要时调用它 - 单击按钮,键入,显示工具提示)。 Working Demo (Using templates)

2 个答案:

答案 0 :(得分:3)

通过将editContact和reset函数更新为以下内容,我得到了所需的结果:

$scope.editContact = function(contact, event) {
  // Nothing first time, but will have an element second time
  $timeout(function() {
    // Click the element and remove the class since it is not in edit mode anymore
    angular.element('.row-edit-mode').triggerHandler('click');
    angular.element('.row-edit-mode').removeClass('row-edit-mode');

    // If it is not a button, then it is the fa-icon, so get its parent, which is a button
    var eventElement = angular.element(event.target).is('button') ? event.target : event.target.parentNode;
    // Find it's sibling with given id, and add a class to it
    angular.element(eventElement).siblings("#table-cancel").addClass('row-edit-mode')

    $scope.model.selected = angular.copy(contact);
  });
};

$scope.reset = function() {
  // Remove class on cancel
  angular.element('.row-edit-mode').removeClass('row-edit-mode');
  $scope.model.selected = {};
};

http://plnkr.co/edit/vAACyxv2bE0li5muefsQ?p=preview

我仍然看到开关之间有轻微的闪烁,所以如果有人有建议让它更顺畅,我会非常感激。

如果我没有看到其他几天达到预期效果的答案,我会将此答案标记为已接受。谢谢所有提供帮助的人!

答案 1 :(得分:0)

您可以使用editContact变量(已经内置到ng-repeat操作中)将ng-repeat操作的索引传递给$index函数:

 <button class="edit-btn" ng-show="edit != true" id="table-edit" ng-click="edit = true; editContact(contact, $index);" uib-tooltip="Delete" tooltip-trigger="mouseenter" tooltip-placement="bottom"><i class="fa fa-fw fa-pencil"></i></button>

请注意,我还给了按钮一个类名!!

然后在您的app.js文件中,当触发一个按钮进行编辑时,您可以将其他按钮的显示设置为none。然后保存编辑时,将显示设置为阻止:

var eles = document.getElementsByClassName('edit-btn');

$scope.editContact = function (contact, ind) {

    $scope.model.selected = angular.copy(contact);

    //remove display of other buttons
    for(var i = 0; i < eles.length; i++){
      if(i != ind){
        eles[i].style.display = "none";
      }
    }

};

$scope.saveContact = function (idx) {
    console.log("Saving contact");
    $scope.model.contacts[idx] = angular.copy($scope.model.selected);

    //redo display of all buttons
    for(var i = 0; i < eles.length; i++){
        eles[i].style.display = "block";
    }

    $scope.reset();
};

您可以在editContact按钮中看到ind变量是所点击的当前编辑按钮的索引。

这是一个Plunker:http://plnkr.co/edit/N9EKErLJkFR5TwEzImNP?p=preview