Sencha Touch 2:从Ext.Msg.confirm中调用控制器功能

时间:2012-05-24 10:42:22

标签: sencha-touch sencha-touch-2

我刚开始使用Sencha Touch 2,之前我从未使用过Sencha Touch 1.x。我刚刚完成了本教程(这是迄今为止我发现的最好的入门教程)http://miamicoder.com/2012/how-to-create-a-sencha-touch-2-app-part-1/,现在我想继续扩展这个Notes应用程序。

我有一个控制器和2个视图,一个列表视图和一个编辑视图。在编辑视图中,我希望能够删除当前记录。删除功能在控制器中。点击删除按钮后,我想显示一个确认对话框(“你确定要删除......?”)。用户按“是”后,应调用删除功能。

现在我的问题是:如何在Ext.Msg.confirm中调用控制器删除功能?

以下是我的代码的相关摘要。如果遗漏了重要的事情,请告诉我。

请参阅“onDeleteNoteCommand”功能。 “this.someFunction”显然不起作用,因为“this”是一个DOMWindow。

Ext.define('TestApp2.controller.Main', {
extend: 'Ext.app.Controller',

config: {
    refs: {
        noteEditorView: 'noteeditorview'
    },
    control: {
        noteEditorView: {
            deleteNoteCommand: 'onDeleteNoteCommand',
        }
    }
},

onDeleteNoteCommand: function() {
    console.log('onDeleteNoteCommand');

    var noteEditor = this.getNoteEditorView();
    var currentNote = noteEditor.getRecord();

    Ext.Msg.confirm(
        "Delete note?",
        "Do you reall want to delete the note <i>"+currentNote.data.title+"</i>?",
        function(buttonId) {
            if(buttonId === 'yes') {
                            //controller functions!! how to call them?
                this.deleteNote(currentNote);                   
                this.activateNotesList();
            }
        }
    );
},

deleteNote: function(record) {
    var notesStore = Ext.getStore('Notes');
    notesStore.remove(record);
    notesStore.sync();
},

activateNotesList: function() {
    Ext.Viewport.animateActiveItem(this.getNotesListView(), this.slideRightTransition);
},

slideLeftTransition: { type: 'slide', direction: 'left' },
slideRightTransition: { type: 'slide', direction: 'right' },

launch: function() {
    this.callParent();
    Ext.getStore('Notes').load();
    console.log('launch main controller');
},
init: function() {
    this.callParent();
    console.log('init main controller');
}
});

1 个答案:

答案 0 :(得分:4)

当您输入Ext.Msg的回调函数时,范围会从控制器范围更改为全局范围(窗口),因此您必须将其设置为确认方法的参数:

  Ext.Msg.confirm(
      "Delete note?",
      "Do you reall want to delete the note <i>"+currentNote.data.title+"</i>?",
      function(buttonId) {
        if(buttonId === 'yes') {
          this.deleteNote(currentNote);                   
          this.activateNotesList();
        }
      }, 
      this // scope of the controller 
    );

有关详细信息,请查看sencha文档:http://docs.sencha.com/touch/2-0/#!/api/Ext.MessageBox-method-confirm