从数组内部取消引用 JavaScript 属性
De-referencing a JavaScript property from inside an array
我正在尝试取消引用 JavaScript 对象上的 属性,但没有得到预期的结果。
我有一组 Knockout 视图模型(我认为问题不是 Knockout 特有的),每个模型都有一个可观察的 Selected
。我添加了对此可观察对象的订阅,以便在 Selected
的值更改时调用函数 crossSelectTargetLangs
。
此外,我将此订阅添加到 for...
循环中。
var tl = 0,
tlMax = allLangVMs.length,
vmLang,
selectedCode;
// for each 'vmLang' view-model in the 'allLangVMs' array...
for (; tl < tlMax; tl++) {
// local variable for the context view-model
vmLang = allLangVMs[tl];
// add the subscription to this observable
vmLang.Selected.subscribe(function() {
// de-reference the vmLang.Code property
selectedCode = (function(code) {
return code;
}(vmLang.Code));
// pass the de-ref'd value to the target function
crossSelectTargetLangs(selectedCode);
});
}
但是,无论哪个视图模型更新了其 Selected
observable,传递给目标函数的参数始终是数组中最后一个元素的 Code
,即它似乎没有取消引用。
我做错了什么?
问题是您在错误的地方取消引用。
代码应如下所示:
var tl = 0,
tlMax = allLangVMs.length,
vmLang,
selectedCode;
// for each 'vmLang' view-model in the 'allLangVMs' array...
for (; tl < tlMax; tl++) {
// local variable for the context view-model
vmLang = allLangVMs[tl];
(function(vmLangParam) {
vmLangParam.Selected.subscribe(function() {
crossSelectTargetLangs(vmLangParam.Code);
});
})(vmLang);
}
我正在尝试取消引用 JavaScript 对象上的 属性,但没有得到预期的结果。
我有一组 Knockout 视图模型(我认为问题不是 Knockout 特有的),每个模型都有一个可观察的 Selected
。我添加了对此可观察对象的订阅,以便在 Selected
的值更改时调用函数 crossSelectTargetLangs
。
此外,我将此订阅添加到 for...
循环中。
var tl = 0,
tlMax = allLangVMs.length,
vmLang,
selectedCode;
// for each 'vmLang' view-model in the 'allLangVMs' array...
for (; tl < tlMax; tl++) {
// local variable for the context view-model
vmLang = allLangVMs[tl];
// add the subscription to this observable
vmLang.Selected.subscribe(function() {
// de-reference the vmLang.Code property
selectedCode = (function(code) {
return code;
}(vmLang.Code));
// pass the de-ref'd value to the target function
crossSelectTargetLangs(selectedCode);
});
}
但是,无论哪个视图模型更新了其 Selected
observable,传递给目标函数的参数始终是数组中最后一个元素的 Code
,即它似乎没有取消引用。
我做错了什么?
问题是您在错误的地方取消引用。 代码应如下所示:
var tl = 0,
tlMax = allLangVMs.length,
vmLang,
selectedCode;
// for each 'vmLang' view-model in the 'allLangVMs' array...
for (; tl < tlMax; tl++) {
// local variable for the context view-model
vmLang = allLangVMs[tl];
(function(vmLangParam) {
vmLangParam.Selected.subscribe(function() {
crossSelectTargetLangs(vmLangParam.Code);
});
})(vmLang);
}