开发者

ExtJS4: When to Use Full Namespace VS Just Object Name (Model Associations)

Part of My Item Model:

    Ext.define('DnD.model.Item', {
        extend: 'Ext.data.Model',
        idProperty:'item_number',
        associations: [{
            type: 'belongsTo',
            model: 'Company',
            primaryKey: 'id',
            foreignKey: 'company_id',
            autoLoad: true
        }],
        proxy: {
            type: 'ajax',
            url: 'data/items.json',
            reader: 开发者_JS百科{
                type: 'json',
                root: 'items',
                idProperty:'id'
            }
        },
        fields: [{
            name: 'id',
            type: 'int'
        },{
            name: 'box_number',
            type: 'float'
        }, {
            name: 'item_number',
            type: 'float'
        }, {
            name: 'name',
            type: 'string'
        },{
            name: 'format',
            type: 'int'
        }, {
            name: 'company_id',
            type: 'int'
        }, {
...

The Company Model

Ext.define('DnD.model.Company', {
    extend: 'Ext.data.Model',
    associations: [{
        type: 'hasMany',
        model: 'Item',
        primaryKey: 'id',
        foreignKey: 'company_id',
        autoLoad: true
    }],
    idProperty:'id',
    fields: [{
        name: 'id',
        type: 'int'
    }, {
        name: 'name',
        type: 'string'
    }],
    proxy: {
        type: 'ajax',
        url: 'data/companies.json',
        reader: {
            successProperty: true,
            type: 'json',
            root: 'companies',
            idProperty:'id'
        }
    }
})

The app.js file

Ext.Loader.setConfig({
    enabled: true,
    paths: {
        Ext: 'extjs/src',
        My: 'app'
    }
});
Ext.application({
    name: 'DnD',
    appFolder: 'app',
    autoCreateViewport: false,
    controllers: [
        'Collections',
        'Items'
    ],
    launch: function() {      
        this.viewport = Ext.create('DnD.view.Viewport', {});
        this.viewport.show();        
    }
});

The Problem

With the code the way it is now, whenever I make a new instance of the item model and attempt to call myItem.getCompany() the console throws an error telling me that the object I created has no such method.

Now, if I change the association to say that an Item belongs to DnD.model.Company (as opposed to just Company), a getter method is created, but it's called getDnD.model.Company() (as opposed to just getCompany()).

From what I can see, it appears that the autoloader can't find the model unless I mention the full path name. However, take a look at my Collection Controller:

Ext.define('DnD.controller.Collections', {
    extend: 'Ext.app.Controller',
    models: [
        'Collection'
    ],
    stores: [
        'Collections',
    ],
    views:[
        'collection.List'
    ],
    refs: [{
        ref: 'collectionList', 
        selector: 'collectionlist'
    }],    
    init: function() {
    }
});

Notice I can reference the models, stores and views without using the full namespace.

Any guidance would be very appreciated.


BelongsTo association has config options "getterName" and "setterName", you can use them to define your own getter and setter method names. Example: {type: 'belongsTo', model: 'My.model.User', foreignKey: 'userId', getterName: 'getUser'} http://docs.sencha.com/ext-js/4-0/#/api/Ext.data.BelongsToAssociation

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜