2

永続化レイヤーの RESTful バックエンドに抽象化を実装しようとしていますが、少し混乱することがあります。$resource サービスにアクセスするために、angular フレームワーク、より具体的には ngResource モジュールを使用しています。問題なくクエリを実行し、バックエンドに対して作業できます。私の問題は、kendo-ui データソースに統合し直すときに発生します。データソースは、クエリがいつ返されたかを認識しません。私の理解では、 $resource は可能な割り当てのために空のコレクション (配列) をすぐに返し、終了時にその配列にクエリの結果を入力します。Kendo-ui の DataSource はこの変数を監視し、更新時にデータソースを利用しているすべての人にこれを反映する必要があります。少し異なるモデル (必要に応じて自分で更新するオブジェクト リテラルを渡す) を使用してこれを正常に実装しましたが、DataSource は更新を問題なく認識します。どんな洞察も役に立ちます!

    app.provider('remotePersistence', function () {
        this.$get = function ($resource) {
            var definitions = {
                widgets: $resource('http://127.0.0.1:3000\:3000/widget.json',{},{
                    archive: { method: 'POST', params: { archive: true }},
                    active: { method: 'POST', params: { active: true }}
                })
            };

            var datastore = {}
            var namespaces = ['widgets'];
            namespaces.forEach(function (namespace) {
                datastore[namespace] = { 
                    endpoint: definitions[namespace], 
                    cache: definitions[namespace].query() 
                };
            });
            return datastore;
        };
    });

    app.controller(
    "WidgetsSearchController",
    function ($scope, remotePersistence){

        $scope.widgets = undefined;

        $scope.visibleWidgets = new kendo.data.DataSource({
            // data: remotePersistence.widgets.cache,
            transport: {
                read: function (options) {
                    options.success(remotePersistence.widgets.cache);
                }
            }
        });
    });
    //This works but is not desirable style
    //$scope.widgets = remotePersistence.widgets.query(function(){ $scope.visibleWidgets.data($scope.widgets) });
4

2 に答える 2

1

データが受信されたことをデータ ソースに通知する必要があります。おそらく、ngResource モジュールは、データのロードが完了すると、何らかのコールバックまたはイベントをトリガーします。その後、Kendo DataSourceのdata () メソッドを使用して、データ項目を入力できます。data メソッドを使用すると、そのデータ ソースにバインドされたすべての Kendo UI ウィジェットが通知を受け取ります。

于 2013-10-18T07:54:16.917 に答える
1

ここをフォローしている人にとっては、うまく機能する私の現在の実装です。並べ替えを渡すために必要な操作にはまだ少し不満がありますが、ページングと一緒に機能します。

app.controller(
    "WidgetSearchController",
    function ($scope, remotePersistence){

        $scope.visibleWidgets = new kendo.data.DataSource({
            widget: {
                read: function (options) {
                    if(options.data.sort){
                        options.data.order = _.map(options.data.sort, function (sortItem) {
                            return sortItem.field + " " + sortItem.dir
                        }).join(", ");
                    }
                    remotePersistence.widgets.endpoint.query(options.data, function(response){
                        console.log(response);
                        options.success(response);
                    });
                }
            },
            schema: {
                data: "widgets",
                total: "total"
            },
            pageSize: 20,
            serverSorting: true,
            serverPaging: true
            // serverFiltering: true
        });
    });

app.provider(
    'remotePersistence', 
    function () {
        this.$get = function ($resource) {
            var definitions = {
                widgets: $resource('http://127.0.0.1:3000\:3000/widgets/:id',{ id: '@id' },{
                    archive: { method: 'PUT', params: { archive: true }},
                    update: { method: 'PUT' },
                    active: { method: 'PUT', params: { active: true }},
                    query: { method: 'GET', isArray: false},


                })
            };

            var datastore = {}
            var namespaces = ['widgets'];
            namespaces.forEach(function (namespace) {
                datastore[namespace] = { 
                    endpoint: definitions[namespace], 
                    cache: definitions[namespace].query() 
                };
            });
            return datastore;
        };
    });
于 2013-10-20T15:46:48.777 に答える