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'}
});

现在完全有道理,有些人希望拥有一个用户商店,每个用户都有自己的产品关联。因此,如果aUser1并且aUser2是两个用户记录存储在用户存储中,则执行以下操作是完全合法的:

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

关键是,有了关联,就没有单例存储——每条记录都有一个存储。

您的 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 回答