【问题标题】:AngularJS inline edit inside of ng-repeatng-repeat 内的 AngularJS 内联编辑
【发布时间】:2018-02-22 17:48:44
【问题描述】:

我正在使用 AngularJS 来显示应用程序键(应用程序标识符)表,我想使用编辑按钮在该表行中显示一个小表单。然后用户可以编辑字段并单击“保存”或“取消”

演示:http://jsfiddle.net/Thw8n/

我的内联表单运行良好。我单击编辑并出现一个表单。取消也很好用。

我的问题是

  1. 如何将保存按钮与将 $http 调用 API 的函数连接起来
  2. 如何从该行获取数据以发送到 $http 调用?
  3. 来电后如何禁用editMode

这是我在控制器中使用的实际代码(在 JSFiddle 中,我无法进行 http 调用)。第一个 $http 填写表单,editAppKey 函数就是保存按钮调用的函数。

function AppKeysCtrl($scope, $http, $location) {
    $http({
        method: 'POST', 
        url: 'http://' + $location.host() + ':1111/sys/appkey/save',
        data: { 
             // How do I get the data?
        }
    }).
    success(function(data, status, headers, config) {
        $scope.appkeys = data;
    }).
    error(function(data, status, headers, config) {
        $scope.appkeys = [{ "appkey" : "ERROR", "name" : "ERROR", "created" : "ERROR" }];
    });

    $scope.editAppKey = function() {
        $http({
            method: 'POST', 
            url: 'http://' + $location.host() + ':1111/sys/appkeys'
        }).
        success(function(data, status, headers, config) {
            alert("Success!");
            $scope.editMode = false;
        }).
        error(function(data, status, headers, config) {
            alert("There was an error.");
        });
    }
}

【问题讨论】:

  • 不要在控制器内部创建任何请求。你有工厂。

标签: angularjs


【解决方案1】:

当我们按下“编辑”按钮并更改其中一个字段时,我们也更改了我们的主模型appkeys。这意味着在“取消”时我们需要恢复旧模型。

这意味着我们至少需要:

所以这是 HTML 的 sn-ps:

       <td>
            <button type="submit" data-ng-hide="editMode" data-ng-click="editMode = true; editAppKey(entry)" class="btn btn-default">Edit</button>
            <button type="submit" data-ng-show="editMode" data-ng-click="editMode = false; saveField()" class="btn btn-default">Save</button>
            <button type="submit" data-ng-show="editMode" data-ng-click="editMode = false; cancel()" class="btn btn-default">Cancel</button>
        </td>

还有我们的控制器:

      $scope.newField = {};
      $scope.editing = false;

 $scope.appkeys = [
     { "appkey" : "0123456789", "name" : "My new app key", "created" : tmpDate },
     { "appkey" : "abcdefghij", "name" : "Someone elses app key", "created" : tmpDate }
 ];

$scope.editAppKey = function(field) {
    $scope.editing = $scope.appkeys.indexOf(field);
    $scope.newField = angular.copy(field);
}

$scope.saveField = function() {
    if ($scope.editing !== false) {
        $scope.appkeys[$scope.editing] = $scope.newField;
        $scope.editing = false;
    }       
};

$scope.cancel = function() {
    if ($scope.editing !== false) {
        $scope.appkeys[$scope.editing] = $scope.newField;
        $scope.editing = false;
    }       
};

演示Fiddle

[编辑]

如果您想一次编辑多行,请使用 newFields 数组而不是 $scope.newField

【讨论】:

  • 我仍在努力,这就是为什么我还没有接受答案。但我要感谢你的 angular.copy(),我正在跳过铁环寻找不同的方式。
  • 这是一个巨大的帮助。谢谢
  • 我遇到了一个问题,我需要在编辑时一次只打开一行。在这里我可以同时打开两行。我该如何避免呢?
  • @forgottofly 焦点丢失开关状态
  • @maxim 我们将如何在保存点击时进行一些输入验证并在失败时阻止保存
【解决方案2】:

你可以通过例如当前索引作为 editAppKey() 函数的参数:

... data-ng-click="editAppKey($index)"

在JS文件中:

$scope.editAppKey = function(index) {
    window.console.log(appkeys[index]); // do what ever you want
}

至于请求返回后禁用。如果我不明白,您只想允许一次编辑,并且在某行上调用一次 editAppKey() 之后,禁用它,对吗?如果是这样,也许像

<button type="submit" data-ng-hide="editMode" data-ng-click="editMode = true" class="btn btn-default"
data-ng-disabled="entry.isDisabled">Edit</button>

在 editAppKey() 函数中,类似

$scope.editAppKey = function(index){
 $http.post(url, data).onsuccess(function(){
    $scope.appkeys[index].isDisabled = true; 

 });

【讨论】:

  • 我遇到了一个问题,我需要在编辑时一次只打开一行。在这里我可以同时打开两行。我该如何避免呢?
【解决方案3】:

如果有人需要同时进行多次编辑:

只需执行以下操作:

在 html 取消按钮上,传递索引 data-ng-click="editMode = false; cancel($index)"

在 JS 方面:

1) $scope.newField = {};$scope.newField = [];

2) 在editAppKey 函数内部,$scope.newField = angular.copy(field);$scope.newField[$scope.editing] = angular.copy(field);

3) 将saveField 函数更改为:

$scope.saveField = function(index) {
        $scope.appkeys[$scope.editing] = $scope.newField;
   };

4) 将cancel 函数更改为:

$scope.cancel = function(index) {
        $scope.appkeys[index] = $scope.newField[index];
        $scope.editing = false;
   };

Fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    相关资源
    最近更新 更多