Angular XEditable 对话框

Angular XEditable Dialog

我有一个 AngularJS 应用程序,我在其中使用 Xeditable 来动态修改 table 值。 我正在使用一种标准方法来编辑值而不显示任何按钮并使用 blur 属性来提交我的所有更改 rapidly 和内联。

<a href="#" buttons="no" blur="submit">{{ myValue }}</a>

不应像在无数示例中那样将确认视为按钮,它们应该仅在保存时显示在对话框中 (onblur)。

由于用户交互问题,我想在更改字段然后单击离开时(或当字段退出其编辑状态时)显示确认对话框。基本上是“onbeforesave=”属性中的内容。

此时应弹出确认消息,通知用户值已更改并询问他们是否要保存。

我知道如何在 onbeforesave 事件上调用一个函数,尽管因为它位于控制器中我不知道如何调用一个确认对话框。

基本步骤如下:

  1. User Clicks on a table cell value
  2. Cell becomes editable.
  3. User changes the cell value.
  4. User clicks away from the cell.
  5. small confirmation dialog pops up (any user friendly or boostrappy way)
  6. User confirms or cancels the edit which was made.
  7. Rinse / Repeat.

感谢任何帮助。

查看当前 fiddle

更新: 我最近的尝试使我实现了 angular-dailog-service 解决了我上面最初的问题,但我仍然无法解决我原来问题的最后一部分。

单击单元格、更改值并单击离开后,我会收到一个对话框 window(确认),当我点击 YES 时将调用我的 api 并保存值 - 这有效。然而,在单击 NO 后,我的值在 table 中保持不变。现在需要将此值恢复为以前的值。有帮助吗?

  • I now use a onshow attribute in order to save my current value of the cell being edited to the scope.
  • I use the onbeforesave attribute in order to launch my dialog and perform the Yes/No check.

HTML:

<a href="#" editable-text="myValue" buttons="no" blur="submit" onbeforesave="launchDialog($data)" onshow="onShow($data)" >{{ myValue || 'empty' }}</a>

控制器:

$scope.oldValue = "";

    $scope.onShow = function(data){
      $scope.oldValue = data;
      };

    $scope.launchDialog = function(data) {
      var dlg = null;
      dlg = dialogs.confirm('Value Changed','Do you want to save this change?');
      dlg.result.then(function(btn){

        //TODO: HIT API AND SAVE VALUE

      },function(btn){
        //RESET TO OLD VALUE
        return "";
      });

    };

如果弄清楚我的 NO 点击功能(其中 RESET TO OLD VALUE是).

我已经成功地通过添加 xeditable 并按照以下方式完成了我的任务,完全按照我从一开始就想要的。 该对话框使用 onbeforesave 属性启动:onbeforesave="launchDialog(this.$editable.name, $data)"

  1. 添加 x-editable
  2. 在我的控制器中创建一个范围 属性 来存储我的旧值。这是在 onShow 事件上完成的。
  3. 添加一个 e-ng-keypress(editable 状态按键事件)
  4. 在控制器中进行相关更改。

PS:担心如何在稍后阶段通过 json 填充 table 数据可能会使事情复杂化,您可能需要创建变量对于每个条目,但它仍然可以满足我的目的。

HTML:

    <tr data-ng-repeat="item in [1,2]">
                            <td>{{ item }}</td>
                            <td><a href="#" editable-text="avg.jan" e-name="jan" e-ng-keypress="enterpress($event, this.$editable.name)" buttons="no" blur="submit" onbeforesave="launchDialog(this.$editable.name, $data)" onshow="onShow($data)" >{{ avg.jan || 'empty' }}</a></td>
 <td><a href="#" editable-text="avg.jan" buttons="no" blur="submit">{{ avg.jan || 'empty' }}</a></td>

我在上面添加了一个比较标准td,以显示新的变化。

控制器

控制器需要一些东西,在某处存储然后分配旧变量(如果值被更改然后取消)。它还需要 Enter 按键检测、保存和对话代码。

$scope.oldValue = "";

    $scope.onShow = function(data){
      $scope.oldValue = data;
      };


    $scope.saveData = function(key, data) {
      //TODO: SAVE DATA TO API
    }

    $scope.enterpress = function (e, data) {
      if (e.which === 13) {
        $scope.saveData();
      }
    }

    $scope.launchDialog = function(key, data) {
      var dlg = null;

      if(data != $scope.oldValue) {

        //ON ENTER KEY PRESS SKIP THE DIALOG + SAVE

        dlg = dialogs.confirm('Value Changed', 'Do you want to save this change?');
        dlg.result.then(function (btn) {
          //SAVE VALUE
          $scope.saveData(key, data);

        }, function (btn) {
          //RESET OLD VALUE
          $scope.avg[key] = $scope.oldValue;

        });
      }
    };

总的来说,我很高兴我终于想通了,拔了几根头发,但最后很有趣。希望它能帮助有类似需求的人:A way in which to extend xeditable functionality.