1

ExtJS を使用して、同じモデルの異なるビューを表示しようとしています (各ビューはモデルのサブセットを表示します)。

次のxmlをロードするネストされたモデルがあります:

<results>
  <hitcount>1234</hitcount>
  <recommended>
     <title>foo</title>
  </recommended>
  <result>
    <title>title1</title>  
    <author>author1</author>  
  </result>
  <result>
    <title>title2</title>  
    <author>author2</author>  
  </result>
</results>  

このモデルの各部分を表示するさまざまなウィジェットが必要です (「結果」を表示するリスト、「推奨」を表示する別のリスト、ヒット数を表示する別のウィジェット)。

私が知らないのは、各ウィジェットでストアを宣言して、完全なモデルのサブセットのみをターゲットにする方法です。

基本的なアプローチのように聞こえますが、この例を見つけることができませんでした (ネストされた構造の例はたくさん見つかりましたが、モデルのサブセットを対象としたストアの例は見つかりませんでした)。

以下の結果部分のみを取得しようとする試みを参照してください。

Ext.define("MySenchaApp.model.ResultModel", {
    extend:"Ext.data.Model",

    config:{
        associations: [
            {
                type:'hasMany',
                model:'MySenchaApp.model.Result',
                name:'results',
                associationKey:'result'
            }
        ],


        proxy:{

            type:"ajax",
            url:'Results.xml',

            reader:{
                type:'xml',
                rootProperty:'results'
            }
        }
    }
});

Ext.define("MySenchaApp.model.Result", {
    extend:"Ext.data.Model",

    config:{
        fields:['title', 'author'],
        belongsTo: 'MySenchaApp.model.ResultModel'
    }
});

Ext.define('MySenchaApp.view.Results', {
    extend:'Ext.navigation.View',
    xtype:'blog',


    config:{
        title:'Results',
        items: [
            {
                xtype:'list',
                itemTpl:'<b>{title}</b> - by <i>{author}</i>',

                store:{
                    autoLoad:true,
                    model:'MySenchaApp.model.Result' // ??
                }
            }
        ]
    }
});
4

1 に答える 1

0

アソシエーション ストアはシングルトンではないため、構成として提供することはできません。

説明

次の例を検討してください。

Ext.define('User', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'id',   type: 'int'},
        {name: 'name', type: 'string'}
    ],
    hasMany: {model: 'Product', name: 'products'}
});

これで、ユーザーごとに独自の製品関連を持つユーザーのストアを持ちたいと考える人がいることは完全に理にかなっています。したがって、aUser1aUser2がユーザー ストアに格納されている 2 つのユーザー レコードである場合、次のようなことを行うことは完全に正当です。

aUser1.products().add( ... );
aUser2.products().add( ... );

要点は、アソシエーションにはシングルトン ストアのようなものはなく、レコードごとに 1 つのストアがあるということです。

あなたの XML は、 1 を超えることはできないことを示唆していますresults。その場合、関連付けを実際に使用するべきではありません。次の行に沿って何かを行う必要があります。

Ext.define("MySenchaApp.model.Results", {
    extend:"Ext.data.Model",

    fields:['title', 'author'],

    proxy:{

        type:"ajax",
        url:'Results.xml',

        reader:{
            type:'xml',
            rootProperty:'results'
        }
    }

});

そして、次の XML を提供します。

<metadata>
    <hitcount>1234</hitcount>
    <recommended>
        <title>foo</title>
    </recommended>
</metadata>
<results>
    <result>
        <title>title1</title>  
        <author>author1</author>  
    </result>
    <result>
        <title>title2</title>  
        <author>author2</author>  
    </result>
</results>

プロキシのmetachangeイベントを使用して、ヒットカウントと推奨を調べます。

于 2013-03-20T22:01:23.703 に答える