使用extjs显示同一模型的不同视图

时间:2013-03-20 10:23:41

标签: javascript extjs extjs4

我尝试使用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>  

我希望有不同的小部件,每个小部件都显示此模型的一部分(一个列表显示&#39;结果&#39;,另一个显示&#39;推荐&#39;,另一个小部件显示hitcount)。

我不知道如何在每个小部件上声明商店以仅定位完整模型的子集。

听起来像是一种基本的方法,但我没有找到这样的例子(我发现了很多嵌套结构的例子,但没有一个存储范围在模型子集上的商店)。

请参阅下面的一些尝试,我尝试仅获取结果部分。

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

1 个答案:

答案 0 :(得分:0)

您不能将关联商店作为配置提供,因为它们从不是单例。

说明

考虑以下示例:

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

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

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事件检查hitcount并推荐。