this
非同期 Ajax 呼び出しの前にキャプチャする
Ajax 成功ハンドラーは非同期で実行されるため、呼び出し先のコンテキスト (またはスコープ) が失われます。this
フリー変数をキャプチャし、関数クロージャ内でキャプチャされた変数を使用する必要があります。
this
2つの意味を期待しているようです
- あなたが使用するとき、あなたはいくつかになることを
$(this).parent()...
期待していますthis
HTMLDOMElement
- あなたが使用するとき、あなたはあなたの(おそらく配列)のオブジェクトアイテムになることを
this.name
期待しています。this
data
オブジェクト インスタンス参照を取得するソリューション
companyPage がクラスであることが明らかになります (キャメル ケースではなく、パスカル ケースにする必要があります)。したがって、this
内の使用。おそらく次の方法で作成します。
var obj = new CompaniesPage();
obj.setChildCategories();
コードは次のようになります。
var CompaniesPage = function()
{
// keep this as public object property
this.childCategoriesSelectId = "#childCategoryid";
// keep this as public object method
this.setChildCategories = function() {
// private reference to object instance for later reuse
var me = this;
$.ajax({
url: this.url, // not sure where this one's coming from
dataType: 'json',
success: function(data) {
$.each(data.childCategories, function() {
$(me.childCategoriesSelectId).append(
$('<option></option>')
.attr('value', this.childCategoryid)
.text(this.name)
);
});
}
});
}
};
クラスの追加の最適化
また、クラスレベルのメソッドを定義した方法はメモリ効率が悪いことを認識する必要があります。これは、個々のオブジェクト インスタンスが同じメソッドを共有するのではなく、特にメモリ リソースに反映される独自のメソッドを持つためです。同じクラスの複数のインスタンスを作成します。
これはあなたのクラスの最適化されたバージョンです:
var CompaniesPage = function() {
// keep this as public object property
this.childCategoriesSelectId = "#childCategoryid";
}
CompaniesPage.prototype.setChildCategories = function() {
// private reference to me as object instance
var me = this;
$.ajax({
url: this.url, // not sure where this one's coming from
dataType: 'json',
success: function(data) {
$.each(data.childCategories, function() {
$(me.childCategoriesSelectId).append(
$('<option></option>')
.attr('value', this.childCategoryid)
.text(this.name)
);
});
}
});
};