Memento в Javascript

голоса
5

Я ищу для реализации JavaScript шаблона сувенира (GoF), которые будут использоваться в CRUD формах. В своем базовом уровне это будет достаточно, чтобы отменить изменения на входах, но было бы здорово использовать его со стандартными рамками JS, как YUI или Ext, чтобы отменить и повторить действия сетки (новую строку, удалить строку и т.д.).

благодаря

Задан 19/05/2009 в 13:13
источник пользователем
На других языках...                            


2 ответов

голоса
0

Так как вы пытаетесь отменить / повторить команды, я предлагаю использовать шаблон Command вместо этого. Вот ссылка на учебник ; это в C #, но это должно быть достаточно просто следовать за ОО программист.

Ответил 19/05/2009 в 13:30
источник пользователем

голоса
6

Так как я не вижу каких-либо примеров кода, вот малоэффективный реализация отмен для формы EXT:

var FormChangeHistory = function(){
    this.commands = [];
    this.index=-1;
}

FormChangeHistory.prototype.add = function(field, newValue, oldValue){
    //remove after current 
    if (this.index > -1 ) {
        this.commands = this.commands.slice(0,this.index+1)
    } else {
        this.commands = []
    }
    //add the new command
    this.commands.push({
        field:field,
        before:oldValue,
        after:newValue
    })
    ++this.index
}

FormChangeHistory.prototype.undo = function(){
    if (this.index == -1) return;
    var c = this.commands[this.index];
    c.field.setValue(c.before);
    --this.index
}

FormChangeHistory.prototype.redo = function(){
    if (this.index +1 == this.commands.length) return;
    ++this.index
    var c = this.commands[this.index];
    c.field.setValue(c.after);
}

Ext.onReady(function(){
    new Ext.Viewport({
        layout:"fit",
        items:[{    
            xtype:"form",
            id:"test_form",
            frame:true,
            changeHistory:new FormChangeHistory("test_form"),
            defaults:{
                listeners:{
                    change:function( field, newValue, oldValue){
                        var form = Ext.getCmp("test_form")
                        form.changeHistory.add(field, newValue, oldValue)
                    }   
                }
            },
            items:[{
                fieldLabel:"type some stuff",
                xtype:"textfield"
            },{
                fieldLabel:"then click in here",
                xtype:"textfield"
            }],
            buttons:[{
                text:"Undo",
                handler:function(){
                    var form = Ext.getCmp("test_form")
                    form.changeHistory.undo();
                }
            },{
                text:"Redo",
                handler:function(){
                    var form = Ext.getCmp("test_form")
                    form.changeHistory.redo();
                }
            }]
        }]
    })
});

Реализация этого для редактируемой сетки немного сложнее, но вы должны быть в состоянии сделать GridChangeHistory, что делает то же самое, а затем вызвать функцию Add () от AfterEdit слушателя EditorGrid в.

«До» и «после» свойства могут быть функции обратного вызова, которые позволяют отменить / повторить любую команду, но это потребует больше работы при вызове добавить ()

Ответил 29/05/2009 в 20:39
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more