不在extjs中提供Child关联的父数据

时间:2013-01-21 03:28:23

标签: extjs extjs4

希望你做得好。

我是extjs4的新手,正在研究关联的示例。

我有2个不同的用户和文凭课程 关于,我已经定义了。

用户拥有多个文凭,文凭属于用户

我的模型如下

user.js的

Ext.define('MyApp.model.User', {
    extend : 'Ext.data.Model',
    idProperty : 'userId',
    fields : [{
        name : 'userId',
        type : 'integer'
    }, {
        name : 'userName',
        type : 'string',

    }],

    hasMany : {
        model : 'MyApp.model.Diploma',
        name : 'diplomas',
    },

});

Diploma.js

Ext.define('MyApp.model.Diploma', {
    extend : 'Ext.data.Model',
    idProperty : 'diplomaId',
    fields : [{
        name : 'diplomaId',
        type : 'integer'
    }, {
        name : 'diplomaName',
        type : 'string',
    }, {
        name : 'userId',
        type : 'integer'
    }],

    associations : [{
        model : 'MyApp.model.User',
        name : 'user',
        type : 'belongsTo'
    }]

});

===================== 我的商店如下。========================

Diploma.js

Ext.define('MyApp.store.Diploma', {
    extend : 'Ext.data.Store',
    model : 'MyApp.model.Diploma',
    autoLoad : true,

    listeners : {
        'load' : {
            fn : function(store, records, success, operation) {
                console.log('Diplomas are loaded');
            }
        }
    }

});

user.js的

  Ext.define('MyApp.store.User', {
        extend : 'Ext.data.Store',
        model : 'MyApp.model.User',
        requires:['Ext.data.proxy.LocalStorage'],
        autoLoad : true,

        listeners : {
            'load' : {
                fn : function(store, records, success, operation) {
                    console.log('User is loaded');
                }
            }
        },

        data : [{
            userId : 1,
            userName : 'Rishabh Shah',
            diplomas:{
                userId : 1,
                diplomaId:1,
                diplomaName:'IT'
            }
        }, {
            userId : 2,
            userName : 'Rakesh Shah',
            diplomas:{
                userId : 2,
                diplomaId:2,
                diplomaName:'CE'
            }
        }, {
            userId : 3,
            userName : 'Rashmin Shah'
        }],

        proxy:{
            type:'memory',
            reader:{
                root:'data'
            }
        }
    });

我可以从这样的用户那里获得文凭并且可以得到结果

Ext.getStore("User").getAt(0).diplomasStore.getAt(0)

但是,当我尝试做

Ext.getStrore("Diploma") or Ext.getStrore("Diploma").getAt(0)

我什么都没得到。物品什么都没有...... 如何让用户获得文凭。

还有一件事....如果我不在我的文凭模型中写代理.. 它给了我这样的错误..

Ext.data.proxy.Server.buildUrl():您使用的是ServerProxy,但尚未提供网址。

请指导我。

感谢。


感谢您的回复.. @ john ..我可以从用户那里获得文凭.. 我希望得到文凭的用户......我自己尝试了......并找到了解决方案......

我将跟随json。

[
    {
        "depId": 1,
        "depName": "CE",
        "employees": [
            {
                "empId": 1,
                "firstName": "Rishabh",
                "lastName": "Shah"
            }, {
                "empId": 2,
                "firstName": "Smit",
                "lastName": "Patel"
            }
        ]
    }, {
        "depId": 2,
        "depName": "IT",
        "employees": [
            {
                "empId": 1,
                "firstName": "Parag",
                "lastName": "Raval"
            }, {
                "empId": 2,
                "firstName": "Rakesh",
                "lastName": "Prajapati"
            }
        ]
    }, {
        "depId": 3,
        "depName": "EE",
        "employees": [
            {
                "empId": 1,
                "firstName": "Parag EE",
                "lastName": "Raval EE"
            }, {
                "empId": 2,
                "firstName": "Rakesh EE",
                "lastName": "Prajapati EE"
            }
        ]
    }, {
        "depId": 4,
        "depName": "EC",
        "employees": [
            {
                "empId": 1,
                "firstName": "Parag EC",
                "lastName": "Raval EC"
            }, {
                "empId": 2,
                "firstName": "Rakesh EC",
                "lastName": "Prajapati EC"
            }
        ]
    }, {
        "depId": 5,
        "depName": "Chemial E",
        "employees": [
            {
                "empId": 1,
                "firstName": "Parag",
                "lastName": "Raval"
            }, {
                "empId": 2,
                "firstName": "Rakesh",
                "lastName": "Prajapati"
            }
        ]
    }, {
        "depId": 6,
        "depName": "ME",
        "employees": [
            {
                "empId": 1,
                "firstName": "Parag",
                "lastName": "Raval"
            }, {
                "empId": 2,
                "firstName": "Rakesh",
                "lastName": "Prajapati"
            }
        ]
    }, {
        "depId": 7,
        "depName": "Civil Engineer",
        "employees": [
            {
                "empId": 1,
                "firstName": "Parag",
                "lastName": "Raval"
            }, {
                "empId": 2,
                "firstName": "Rakesh",
                "lastName": "Prajapati"
            }
        ]
    }
]

我将根据我的要求使用 model.getAssociatedData().user

其中模型是我的子类记录,用户是我的父类 ..

我在我的文凭模型中使用代理并没有被要求......所以,得到了

Ext.data.proxy.Server.buildUrl():您使用的是ServerProxy,但尚未提供网址。

上述错误。

全部谢谢! :)

1 个答案:

答案 0 :(得分:3)

究竟什么不起作用?您是否能够使用魔术方法,例如User.diplomas()?正如@VDP所述,为Association创建的商店是一个正常Ext.data.Store范围,用于父模型(在本例中为User)的数据集。也就是说,如果您的User模型id1,则调用方法User.diplomas()将返回Ext.data.Store过滤后仅包含Diploma {1}} user_id 1

理解这一点非常重要! 如果您未在foreignKey关联中指定hasMany属性,则默认为所有者模型的小写名称加上“_id”,您应修改User 1}}模型的hasMany关联如下:

Ext.define('MyApp.model.User', {
/** Model Definition */
hasMany : {
    model : 'MyApp.model.Diploma',
    name : 'diplomas',
    foreignKey : userId /** This is what you're missing */
}
});

也许你会发现这篇博文有用吗? http://extjs-tutorials.blogspot.com/2012/05/extjs-hasmany-relationships-rules.html

博客文章中的一些重要提示(如果链接在某个时刻死亡)

  • 除非您,否则请始终将您的代理商放入您的型号,而不是您的商店 有充分的理由不要*
  • 如果在hasMany中使用它们,则始终需要您的子模型 关系。 **
  • 如果您想随意加载孩子,请始终使用foreignKey
  • 如果您返回同一个孩子,请始终使用associationKey 作为父母的回应
  • 如果您愿意,可以同时使用foreignKey和associationKey
  • 始终为您的hasMany关系命名
  • 始终在hasMany关系中使用完全限定的模型名称
  • 考虑给读者提供一个有意义的名称(“数据”除外)
  • 子模型不需要belongsTo关系 有很多工作

*商店将继承其模型的代理,您可以随时覆盖它

**为了简化并避免潜在的循环引用,您可以在app.js

中要求它们

信用:Neil McGuigan(http://www.blogger.com/profile/14122981831780837323