【问题标题】:kendo-ui grid inline edit angularjskendo-ui网格内联编辑angularjs
【发布时间】:2023-04-10 09:57:01
【问题描述】:

我想在我的 kendo-ui 网格中进行内联编辑。数据绑定似乎工作正常,但是当我在编辑某些内容后单击“更新”按钮时,范围会更新,但编辑对话框不会消失。如果单击另一个编辑按钮,它将进入失效状态。毕竟,如果我至少提供一个虚拟函数作为 k-save,它只会更新范围。出于某种原因,单击“取消”按钮确实会更新范围。所以 Cancel 按钮完成了我对 Update 按钮的期望。

如您所见,我想在客户端更新本地范围,而不向任何服务器发送任何内容。

有人能告诉我这里出了什么问题吗?

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <link rel="stylesheet" href="http://cdn.kendostatic.com/2014.3.1119/styles/kendo.common.min.css" />
    <link rel="stylesheet" href="http://cdn.kendostatic.com/2014.3.1119/styles/kendo.default.min.css" />
    <link rel="stylesheet" href="http://cdn.kendostatic.com/2014.3.1119/styles/kendo.dataviz.min.css" />
    <link rel="stylesheet" href="http://cdn.kendostatic.com/2014.3.1119/styles/kendo.dataviz.default.min.css" />
</head>
<body>
    <div id="example" ng-app="gridTestApp" ng-controller="TestController">
        <kendo-grid  
            k-data-source="gridData"
            k-columns="gridColumns"
            k-on-change="selected = data"
            k-selectable="true"
            k-editable="editableOptions"
            k-schema="gridSchema"
            k-save="saveFunction">
        </kendo-grid>
        <p ng-show="selected">
            <label>Artist: <input ng-model="selected.artist" /></label>
            <br />
            <label>Track: <input ng-model="selected.track" /></label>
        </p>
        <p>This is for testing data-binding</p>
        <ul>
            <li data-ng-repeat="gridRow in gridData">
                <input ng-model="gridRow.artist"></input><input ng-model="gridRow.track"></input>
                <br>
            </li>
        </ul>
        <p>This is for testing data-binding</p>
        <ul>
            <li data-ng-repeat="gridRow in gridData">
                <span ng-bind="gridRow.artist"></span> -<span ng-bind="gridRow.track"></span>
                <br>
            </li>
        </ul>
    </div>
    <script src="https://code.jquery.com/jquery-1.11.2.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.8/angular.js"></script>
    <script src="http://cdn.kendostatic.com/2014.3.1119/js/kendo.all.min.js"></script>
    <script>
        angular.module("gridTestApp",[ "kendo.directives" ])
            .controller("TestController", function($scope){
                $scope.gridData = new kendo.data.ObservableArray([
                    { artist: "Pink Floyd", track: "The dark side of the Moon" },
                    { artist: "The Beatles", track: "I've just seen a face" },
                    { artist: "Queen", track: "Innuendo" }
                ]);
                $scope.gridColumns = [
                    { field: "artist", title: "Artist" },
                    { field: "track", title: "Track" },
                    { command: /*"destroy"*/["edit", "destroy"], title: " ", width: "175px", editable: "inline" }
                ];
                $scope.editableOptions = {mode: "inline", update: true, destroy: true};
                $scope.gridSchema = {
                    model: {
                       id: "artist",
                       fields: {
                            artist: { type: "string", validation: { required: true } },
                            track: { type: "string", validation: { required: true } }
                        }
                    }
                }
                $scope.saveFunction = function(){
                    console.log("somehting was modified");
                }
            });
    </script>
</body>
</html>

我为你创建了一个plnkr

【问题讨论】:

    标签: angularjs kendo-ui kendo-grid angular-kendo


    【解决方案1】:

    您的问题是架构 - 这不是网格配置选项,而是 DataSource 配置选项。

    我建议创建一个实际的 DataSource 而不是 ObservableArray(使用字符串 id 可能也不理想):

    $scope.gridData = new kendo.data.DataSource({
        data: [{
            artist: "Pink Floyd",
            track: "The dark side of the Moon"
        }, {
            artist: "The Beatles",
            track: "I've just seen a face"
        }, {
            artist: "Queen",
            track: "Innuendo"
        }],
        schema: {
            model: {
                id: "artist",
                fields: {
                    artist: {
                        type: "string",
                        validation: {
                            required: true
                        }
                    },
                    track: {
                        type: "string",
                        validation: {
                            required: true
                        }
                    }
                }
            }
        }
    });
    

    (demo)

    【讨论】:

    • 谢谢!我遇到的问题是网格的数据是应该更新的范围对象。我能做的是$scope.gridData = new kendo.data.DataSource({ data: $scope.myData; ... 之类的东西,但是包含数据的范围对象将不会得到更新。而且由于某种原因,我不能做像$scope.myOtherGridDataObject = $scope.gridData.data(); 这样的事情......
    • 一种选择是保持动态数据分离并在通过 $scope.gridData.data($scope.dynamicData) 更新 DS 时更新 DS:plnkr.co/edit/AkKBtTVWRrhvJyF8Kmfd?p=preview(或者您通过API 并在需要其他地方的数据时查询 DS)
    • 这对我进行了排序,更改是将架构添加到带有模型和 ID 的 Kendo 数据源中。我最初考虑尝试向保存功能添加一些内容,但结果证明这是不必要的,您根本不需要该功能来进行数据更新。这是一个(不同的)简化示例,其中包含使其工作的最低要求plnkr.co/edit/9k1o53vblxAqV3yGcHkB?p=preview
    • @Lars Höppner:我刚刚意识到,在您的示例中,$scope.dynamicData 在您更改网格时不会更新。您能解释一下“通过 $scope.gridData.data($scope.dynamicData) 更新 DS 时更新 DS”是什么意思吗?
    • 呃,那是一种笨拙的说法;如果要使用常规阵列,则必须手动使其与 DS 保持同步;但是,从您的原始示例来看,您似乎可以选择使用 ObservableArray,因此您只需将其传递给 DS,它将保持同步:plnkr.co/edit/StzveDlS6qo5UarGtyQZ?p=preview
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 2020-10-12
    相关资源
    最近更新 更多