CRUD フォームで使用する memento パターン (GoF) の JavaScript 実装を探しています。基本的なレベルでは、入力の変更を元に戻すだけで十分ですが、YUI や Ext などの標準の JS フレームワークで使用して、グリッド アクション (新しい行、行の削除など) を元に戻したりやり直したりすると便利です。
ありがとう
CRUD フォームで使用する memento パターン (GoF) の JavaScript 実装を探しています。基本的なレベルでは、入力の変更を元に戻すだけで十分ですが、YUI や Ext などの標準の JS フレームワークで使用して、グリッド アクション (新しい行、行の削除など) を元に戻したりやり直したりすると便利です。
ありがとう
コード例を見ていないので、EXT フォームの undo の簡単な 'n Dirty 実装を次に示します。
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 を作成し、EditorGrid の AfterEdit リスナーから add() 関数を呼び出すことができるはずです。
「before」および「after」プロパティは、あらゆる種類のコマンドを元に戻したりやり直したりできるコールバック関数にすることができますが、add() を呼び出すときにさらに作業が必要になります。
コマンドを元に戻したりやり直したりしようとしているので、代わり にCommand パターンを使用することをお勧めします。ここにチュートリアルへのリンクがあります。これは C# で書かれていますが、OO プログラマーが従うには十分に単純なはずです。