我已经开始实现一个简单的 Sencha Touch MVC 应用程序(使用 Sencha Touch 2.2.0),它主要工作,但我无法让控制器实例化列表中显示的项目的编辑器视图。
我通过它的 xtype 引用编辑器,但编辑器实例的相应属性是“未定义”。我在这里和 Sencha Touch 论坛上找到的所有类似问题的解决方案都没有帮助。我正在使用导航器视图在页面之间切换。
这是 app.js 源代码:
var app = Ext.application({
name: 'PotApp',
models: ['GlazeMaterial', 'Clay'],
stores: ['GlazeMaterials', 'Clays'],
views: ['Dashboard', 
        'ReferenceDataMenu',
        'CalculatorMenu',
        'GlazeMaterialsList',
        'GlazeMaterialEditor'],
controllers: ['Dashboard', 'Calculator', 'GlazeMaterials'],
launch: function() {
    this.launched = true;
    this.mainLaunch();
},
mainLaunch: function() {
    if (!window.isDesktop)
    {
    if (!device || !this.launched)
    {
        return;
    }
}
    var dashboard = {
        xtype: 'dashboard'
    };
    Ext.Viewport.add([dashboard]);
}
});
显示列表的导航控制器部分(工作正常):
onShowGlazeMaterialsCommand: function () {
    var dashboardView = this.getDashboard();
    dashboardView.push({
       xtype: 'glazeMaterialsList'
    });
}
用于处理列表的控制器和用于釉料的编辑器。问题似乎是 glazeMaterialEditor: 'glazeMaterialEditor' 行,它没有将 glazeMaterialEditor 设置为编辑器的实例。
Ext.define('PotApp.controller.GlazeMaterials', {
extend: 'Ext.app.Controller',
config: {
    refs: {
        glazeMaterialsList: 'glazeMaterialsList',
        glazeMaterialEditor: 'glazeMaterialEditor',
        dashboard : {
            autoCreate: true,
            selector: '#dashboard',
            xtype: 'dashboard'
        }
    },
    control: {
        glazeMaterialsList: {
            newGlazeMaterialCommand: 'onNewGlazeMaterialCommand',
            editGlazeMaterialCommand: 'onEditGlazeMaterialCommand'
        },
        glazeMaterialEditor: {
            saveGlazeMaterialCommand: 'onSaveGlazeMaterialCommand',
            deleteGlazeMaterialCommand: 'onDeleteGlazeMaterialCommand',
            backToHomeCommand: 'onBackToHomeCommand'
        }
    }
},
activateGlazeMaterialEditor: function (record, pop) {
    var glazeMaterialEditor = this.getGlazeMaterialEditor();
    glazeMaterialEditor.setRecord(record); // load() is deprecated.
    var dashboardView = this.getDashboard();
    if (pop)
    {
        this.getDashboard().pop();
    }
    this.getDashboard().push(glazeMaterialEditor);
},
activateGlazeMaterialsList: function (pop) {
    var dashboardView = this.getDashboard();
    if (pop)
    {
        this.getDashboard().pop();
    }
    this.getDashboard.push(this.getGlazeMaterialsList());
},
onNewGlazeMaterialCommand: function () {
    console.log('onNewGlazeMaterialCommand');
    var newGlazeMaterial = Ext.create('PotApp.model.GlazeMaterial', {
        Name: '',
        Description: ''
    });
    this.activateGlazeMaterialEditor(newGlazeMaterial, false); 
},
onEditGlazeMaterialCommand: function (list, record) {
    console.log('onEditGlazeMaterialCommand');
    this.activateGlazeMaterialEditor(record, false);
},
onSaveGlazeMaterialCommand: function () {
    console.log('onSaveGlazeMaterialCommand');
    var glazeMaterialEditor = this.getGlazeMaterialEditor();
    var currentGlazeMaterial = glazeMaterialEditor.getRecord();
    var newValues = glazeMaterialEditor.getValues();
    // Update the current GlazeMaterial's fields with form values.
    currentGlazeMaterial.set('Name', newValues.Name);
    currentGlazeMaterial.set('Description', newValues.Description);
    var errors = currentGlazeMaterial.validate();
    if (!errors.isValid()) {
        Ext.Msg.alert('Wait!', errors.getByField('title')[0].getMessage(), Ext.emptyFn);
        currentGlazeMaterial.reject();
        return;
    }
    var glazeMaterialsStore = Ext.getStore('GlazeMaterials');
    if (null == glazeMaterialsStore.findRecord('Name', currentGlazeMaterial.data.Name)) {
        glazeMaterialStore.add(currentGlazeMaterial);
    }
    glazeMaterialsStore.sync();
    glazeMaterialsStore.sort([{ property: 'Name', direction: 'ASC'}]);
    this.activateGlazeMaterialsList(true);
},
onDeleteGlazeMaterialCommand: function () {
    console.log('onDeleteGlazeMaterialCommand');
    var glazeMaterialEditor = this.getGlazeMaterialEditor();
    var currentGlazeMaterial = glazeMaterialEditor.getRecord();
    var glazeMaterialsStore = Ext.getStore('GlazeMaterials');
    glazeMaterialsStore.remove(currentGlazeMaterial);
    glazeMaterialsStore.sync();
    this.activateGlazeMaterialsList(true);
},
// Base Class functions.
launch: function () {
    this.callParent(arguments);
    var glazeMaterialsStore = Ext.getStore('GlazeMaterials');
    glazeMaterialsStore.load();
    console.log('launch');
},
init: function () {
    this.callParent(arguments);
    console.log('init');
}
});
编辑器视图:
Ext.define('PotApp.view.GlazeMaterialEditor', {
extend: 'Ext.form.Panel',
requires: ['Ext.Toolbar', 'Ext.form.FieldSet', 'Ext.form.Text', 'Ext.field.TextArea',   'Ext.MessageBox'],
alias: 'widget.glazeMaterialEditor',
config: {
    scrollable: 'vertical',
    items: [
        {
            xtype: 'titlebar',
            docked: 'top',
            title: 'Edit Glaze Material',
            items: [
                {
                    xtype: 'button',
                    ui: 'action',
                    text: 'Save',
                    itemId: 'saveButton',
                    align: 'right'
                }
            ]
        },
        {
            xtype: 'toolbar',
            docked: 'bottom',
            items: [
                {
                    xtype: 'button',
                    iconCls: 'trash',
                    iconMask: true,
                    itemId: 'deleteButton'
                }
            ]
        },
        { xtype: 'fieldset',
            items: [
                {
                    xtype: 'textfield',
                    name: 'Name',
                    label: 'Name',
                    required: true
                },
                {
                    xtype: 'textareafield',
                    name: 'Description',
                    label: 'Description'
                }
            ]
        }
    ],
    listeners: [
        {
            delegate: '#saveButton',
            event: 'tap',
            fn: 'onSaveButtonTap'
        },
        {
            delegate: '#deleteButton',
            event: 'tap',
            fn: 'onDeleteButtonTap'
        }
    ]
},
onSaveButtonTap: function () {
    console.log('saveGlazeMaterialCommand');
    this.fireEvent('saveGlazeMaterialCommand', this);
},
onDeleteButtonTap: function () {
    console.log('deleteGlazeMaterialCommand');
    this.fireEvent('deleteGlazeMaterialCommand', this);
}
});
我将不胜感激任何帮助。
谢谢,斯特凡