Javascript 与剑道成角度,异步使用栅格值

Javascript 与剑道成角度,异步使用栅格值,javascript,angularjs,asynchronous,kendo-grid,Javascript,Angularjs,Asynchronous,Kendo Grid,好的,我很确定我知道我在这里需要做什么,但我不知道怎么做。基本上,我有一个网格,我想让一个键列绑定到一个键/值数组,这是我以前用剑道做过的(不使用Angular),我知道当我异步创建键/值数组时,需要先完成这个网格,然后我才能用剑道显示它们,我以前用承诺做过 所以这里我有同样的问题,只涉及到角度。我需要获取数据数组并将其格式化为剑道网格列可以消化的格式,因此我的控制器代码没有问题: var realm = kendo.data.Model.define({

好的,我很确定我知道我在这里需要做什么,但我不知道怎么做。基本上,我有一个网格,我想让一个键列绑定到一个键/值数组,这是我以前用剑道做过的(不使用Angular),我知道当我异步创建键/值数组时,需要先完成这个网格,然后我才能用剑道显示它们,我以前用承诺做过

所以这里我有同样的问题,只涉及到角度。我需要获取数据数组并将其格式化为剑道网格列可以消化的格式,因此我的控制器代码没有问题:

       var realm = kendo.data.Model.define({
            id: 'realmID',
            fields: {
                realmID: { editable: false, nullable: true }
                realmType: { type: 'string', validation: { required: true } }
            }
        })

        var ds1 = kendoHelpers.dataSourceFactory('realms', realm, 'realmID')

        var realmType = kendo.data.Model.define({
            id: 'realmTypeID',
            fields: {
                realmTypeID: { editable: false, nullable: true },
                name: { type: 'string', validation: { required: true } }
            }
        })

        var ds2 = kendoHelpers.dataSourceFactory('realms/types', realmType, 'realmTypeID')

        $scope.mainGridOptions = {
            dataSource: ds1,
            editable: true,
            navigatable: true,
            autoBind:false,
            toolbar: [
                { name: "create" },
                { name: 'save' },
                { name: 'cancel' }
            ],
            columns: [
                { field: 'realmID', title: 'ID' }
                { field: 'realmTypeID', title: 'Realm Type', editor: realmTypesDDL, values: $scope.realmTypeValues },
                { command: "destroy" }
            ]
        }

        $scope.secondGridOptions = {
            dataSource: ds2,
            editable: true,
            navigatable: true,
            toolbar: [
                { name: "create" },
                { name: 'save' },
                { name: 'cancel' }
            ],
            columns: [
                { field: 'realmTypeID', title: 'ID' },
                { field: 'name', title: 'Name' }
                { command: "destroy" }
            ]
        }

        ds2.fetch(function () {
            $scope.realmTypeValues = [{ text: 'Test', value: "24bc2e62-f761-4e70-804c-bc36fdeced3d" }];
            //this.data().map(function (v, i) {
            //    $scope.realmTypeValues.push({ text: v.name, value: v.realmTypeID})
            //});
            //$scope.mainGridOptions.ds1.read()
        });


        function realmTypesDDL(container, options) {
            $('<input />')
                .appendTo(container)
                .kendoDropDownList({
                    dataSource: ds2,
                    dataTextField: 'name',
                    dataValueField: 'realmTypeID'
                });
        }

但这感觉不是很有棱角感,所以我真的希望有一个更好的解决方案

好吧……我想我已经做得够多了,在没有其他建议的情况下,我将继续采用这种方法。我将把绑定逻辑移动到第二个网格的requestEnd事件,这样就可以在绑定之前填充values数组。我还在这个方法中重新设计值数组。不过这有点奇怪,我认为这个阵法有一些剑道黑魔法在起作用,因为我不能把它设置成一个新的空阵法而不完全破坏它…这就是为什么我在重新填充阵法之前要把所有的东西都弹出。这样,当在第二个网格中删除或编辑某些内容时,第一个网格中的DDL将在回调中更新

        function requestEnd(e) {
        for (var i = $scope.realmTypeValues.length; i >= 0; i--) $scope.realmTypeValues.pop();

        var data;

        if (e.type == "read")
            data = e.response;
        else
            data = e.sender.data();

        data.map(function (v, i) { $scope.realmTypeValues.push({ text: v.name, value: v.realmTypeID }); });

        if ($('#realms').data('kendoGrid') == undefined) {
            $('#realms').kendoGrid($scope.mainGridOptions);
        }
        else
            $('#realms').data('kendoGrid').columns[4].values = $scope.realmTypeValues;
    }

    ds2.bind('requestEnd', requestEnd);

所以我要接受我自己的答案,除非有人有更好的方法

您知道传输对象的read属性也可以是函数吗?我用它来决定什么时候填充东西。是的,我知道,但我不认为这会有什么帮助?我误解了你的要求。
<h2>Realms</h2>
<div id="realms"></div>
<h2>Realm Types</h2>
<kendo-grid options="secondGridOptions"></kendo-grid>
ds2.fetch(function () {this.data().map(function (v, i) {
        $scope.realmTypeValues.push({ text: v.name, value: v.realmTypeID})
    });
    $('#realms').kendoGrid($scope.mainGridOptions);
    $scope.mainGridOptions.dataSource.fetch()
});
        function requestEnd(e) {
        for (var i = $scope.realmTypeValues.length; i >= 0; i--) $scope.realmTypeValues.pop();

        var data;

        if (e.type == "read")
            data = e.response;
        else
            data = e.sender.data();

        data.map(function (v, i) { $scope.realmTypeValues.push({ text: v.name, value: v.realmTypeID }); });

        if ($('#realms').data('kendoGrid') == undefined) {
            $('#realms').kendoGrid($scope.mainGridOptions);
        }
        else
            $('#realms').data('kendoGrid').columns[4].values = $scope.realmTypeValues;
    }

    ds2.bind('requestEnd', requestEnd);