3

私は2つのモデルを持っています:本はAuthorに属します。サーバーからExtJに行き来する途中で、本のデータと一緒に送信された著者データを調査してみましょう。サーバーは次のネストされたデータをExtJに送信します。

{
  success : true,
  data: {
    id: '23',
    name: 'JavaScript - The definitive guide'
    author: {                                  // <<-- nested author data
        id: '45',
        name: 'David Flanagan',
    }
  }
}

ExtJの側では、データは次のモデルによって処理されます。

Ext.define('My.models.Book', {
    extend: 'Ext.data.Model',
    idProperty: 'id',

    fields: [
        'id',, 
        'name',
        {name: 'author_id', mapping: 'Author.id'}, // <<-- flat author data
    ],

    proxy: {
        type: 'ajax',
        api: {
            read: 'My/Books/index',
            create: 'My/Books/create',
            update: 'My/Books/update',
            destroy: 'My/Books/delete'
        },
        reader: {
            type: 'json',
            root: 'data',
        },
        writer: {
            type: 'json',
            root: 'data',
        },
    },

    associatinons: [{
        type: 'belongsTo', 
        model: 'My.models.Author', 
        associationKey: 'Author', 
    }]    
});

モデルのフィールドへのマッピングのおかげで(Author.idauthor_id著者のデータを、本のデータを編集するために設計された次のフォームにロードできます。Book{name: 'author_id', mapping: 'Author.id'}

Ext.define('My.views.books.Form', {
    extend: 'Ext.form.Panel',
    initComponent: function () {
        var me = this;
        me.items = [{
            xtype: 'container',
            layout:'anchor',
            defaults:{
                anchor: '95%'
            },
            items:[{
                xtype: 'textfield',
                fieldLabel: 'Book title',
                name: 'name'
            },{
                xtype: 'combo',
                fieldLabel: 'Author',
                name: 'author_id',            // <<-- flat author data
                store: ...
            }]
        }];    
        me.buttons = [{
            text: 'Save',
            scope: me,
            handler: me.onSave
        }];
        me.callParent(arguments);
    },
    ...
});

もちろん、著者専用のモデルもありますが、本と著者のデータを一度に1つのフォームにロードする必要がある場合、上記のような他の可能性は(今のところ)わかりません(もちろん見せてください)。 、より良い解決策がある場合)。

問題が発生しました。コンボから他の作成者を選択し、フォームを保存します。書籍のレコードが汚れると(author_id現在はBookモデルフィールドとして表示され'My/Books/update'ます)、次のデータがサーバーに送信されたURLへのリクエストが発生します(これは大丈夫です、私は書籍を編集しています)。

{
  data: {
    id: '23',
    name: 'JavaScript - The definitive guide',
    author_id: '78'              // <<-- flat author data
  }
}

サーバーに返されるデータは、ExtJに送信されたものと同じ構造ではなく、次のような何らかの変換を行う必要があります。

$data['Author']['id'] = @$data['author_id'];
unset($data['author_id']);

私が尋ねているのは、ExtJsフォームでデータを処理して、サーバーから取得したのと同じ構造でサーバーに戻るようにすることは可能ですか?どうやって?

この質問は、ここここ、ここですでに何らかの形で議論されていますが、どちらの議論も明確に答えていません。

助けてくれてありがとう!:)

4

1 に答える 1

1

短い答え:いいえ、まだです。

より長い答え:データ構造を処理する独自のライターを作成し、受信したのと同じ方法でサーバーに送り返すことができます。

http://docs.sencha.com/ext-js/4-2/#!/api/Ext.data.writer.Writerをサブクラス化して独自のライターを作成し、プロキシで使用することもできます。

また

モデルの構造を変更する関数をモデルに作成できます。ストアを使用していないため、モデル構造を変更してsave()メソッドを呼び出す関数saveModel()を作成できます。

于 2013-04-03T12:51:17.687 に答える