简体   繁体   中英

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: {
                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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM