ExtJS4: когда использовать полное пространство имен VS просто имя объекта (ассоциации моделей) - PullRequest
0 голосов
/ 04 июня 2011

Часть моего товара Модель:

    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'
        }, {
...

Модель компании

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

Файл app.js

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

Проблема

С таким кодом, как сейчас, всякий раз, когда я делаю новый экземпляр модели элемента и пытаюсь вызвать myItem.getCompany(), консоль выдает ошибку, сообщающую, что у созданного мною объекта такого метода нет.

Теперь, если я изменю ассоциацию, чтобы сказать, что Предмет принадлежит DnD.model.Company (в отличие от Company), создается метод получения, но он называется getDnD.model.Company() (в отличие отпросто getCompany()).

Из того, что я вижу, кажется, что автозагрузчик не может найти модель, пока я не упомяну полное имя пути.Однако взгляните на мой контроллер коллекции:

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

Обратите внимание, что я могу ссылаться на модели, магазины и представления без использования полного пространства имен.

Любое руководство будет очень ценится.

1 Ответ

1 голос
/ 09 июня 2011

BelongsTo ассоциация имеет параметры конфигурации "getterName" и "setterName", вы можете использовать их для определения собственных имен методов получения и установки. Пример: {тип: 'ownTo', модель: 'My.model.User', foreignKey: 'userId', getterName: 'getUser'} http://docs.sencha.com/ext-js/4-0/#/api/Ext.data.BelongsToAssociation

...