私は JavaScript でいくつかのクラスを書き、それらのためにいくつかの FunctionFactory を書きました。しかし、私はいくつか間違ったことをしたと思います。
あなたがそれをよりよく理解できるように、コードのいくつかの名前を変更しました。
したがって、最初のクラスは「ルート」クラスです。このクラスには子があり、後で追加します。
function templateRoot(){
this.id = "root";
this.parent = null;
this.children = [];
this.editable = true; // bla
this.render = function(){
$.each(this.children,function(i,obj){
this.children[i].render();
var baseButtons = this.getBaseButtons();
$('#'+this.id).append(baseButtons);
});
};
this.addBase = addBaseFactory(this);
};
属性「addBase」は、addBaseFactory によって配信される関数を取得します...
function addBaseFactory(that){
return function(){
var newBase = new base(that.children.length, that.id);
that.children.push(newBase);
};
}
...そして、「addBase」でオブジェクトを生成するために使用される基本クラスは次のようになります。
function base(count, parent){
this.id = parent+"_base"+count;
this.parent = parent;
this.children = [];
this.remove = function (){
$('#'+this.id).remove();
};
this.render = baseRenderFactory(this);
this.addChild = addChildFactory(this);
this.getBaseButtons = function(){
var addAttributeButton = new $("<button>+ Attribute</button>").button();
var addTextButton = new $("<button>+ Text</button>").button();
return [addAttributeButton, addTextButton];
};
}
問題は今です。コードをデバッグし、ルート オブジェクトの「レンダリング」関数内にブレークポイントを設定すると。次に、「これ」はルートではなく「ベース」オブジェクトであることがわかります。そして、「ルート」オブジェクトがこの関数の所有者であり、私のベースにはそこに直接呼び出されない独自のレンダー関数があるため、なぜそうなのかわかりません。
そのため、行の「これ」でさえ
$.each(this.children,function(i,obj){
「ベース」オブジェクトを参照します。しかし、「これ」は「ルート」オブジェクトの中にあります...
あなたが私を助けてくれることを願っています:-)
編集:
実行するためのコード:
var test = new templateRoot();
test.addBase();
test.render();
編集2:
「addBaseFactory」の「それ」は、正しい「ベース」オブジェクトを指します。