我有两个函数generate
和test
。当用户单击按钮generate
时,会调用test
函数。我收到以下错误:
传递一个返回ko.computed值的函数。
测试函数中该行引发错误:
var unmapped = ko.mapping.toJS(this);
this
是我的具有ko.observable属性的viewmodel。
这是两个功能。如果我将test
函数的内容移动到generate
,一切正常,但我需要逻辑在两个不同的函数中。我该怎么办?
我非常困在这里。任何帮助都会受到很大的影响。
generate = function () {
if (!omega.validatableFranchiseGeneration.validate()) {
return false;
}
omega.franchiseInfo.IsForGeneration(true);
test();
}
var test = function () {
getIpsAndPorts();
for (var i = 0; i < omega.franchiseInfo.LanguagesInfoViewModel().length; i++) {
if ($.isArray(omega.franchiseInfo.LanguagesInfoViewModel()[i].SubMenuItemsViewModel)) {
omega.franchiseInfo.LanguagesInfoViewModel()[i].SubMenuItemsViewModel = omega.franchiseInfo.LanguagesInfoViewModel()[i].SubMenuItemsViewModel[0];
}
}
var unmapped = ko.mapping.toJS(this);
var jsonData = ko.toJSON(unmapped);
$.ajax({
url: "/franchise/Save",
type: "POST",
// data: ko.toJSON({ folderName: FolderName }),
data: { franchiseInfoViewModel: jsonData },
//traditional: true,
//contentType: "application/json; charset=utf-8",
dataType: 'json',
success: function (data, textStatus, xhr) {
window.location.href = data.redirectToUrl;
},
error: function (request, status, error) {
jsonValue = jQuery.parseJSON(request.responseText);
omega.franchiseInfo.errorMessages([]);
for (var i = 0; i < jsonValue.errorMessages.length; i++) {
omega.franchiseInfo.errorMessages.push({ errorMessage: ko.observable(jsonValue.errorMessages[i].ErrorMessage) });
}
for (var i = 0; i < omega.franchiseInfo.LanguagesInfoViewModel().length; i++) {
InitializeViewLanguagesInfo(omega.franchiseInfo.LanguagesInfoViewModel()[i]);
}
}
});
}
答案 0 :(得分:1)
如果没有看到你的所有代码,这很难确定,但如果代码(按原样)直接包含在generate中,那么我愿意打赌this
不是你认为的那样在test
函数中。 this
函数中test
的含义与generate
内的含义不同。
启动Chrome或Firebug并在var unmapped = ko.mapping.toJS(this);
行设置断点。运行程序,当断点点击进入控制台并查看this
时。它是你的ViewModel吗?
如果this
符合您generate
内的预期,您可以随时拨打test
:
test.apply(this);
这将为方法调用显式设置this
的上下文。
另一种选择是在ViewModel中设置self
变量。这通常在顶部完成,看起来像:var self = this;
。通过创建此变量,您可以引用self' inside any functions within the outer "function" scope, and not have to worry about the value of
此信号波动。
-
这是一个简单的小提琴来模拟我认为发生的事情:http://jsfiddle.net/jearles/aLFWe/
打开Chrome或Firebug控制台,查看已记录的对象。请注意,Window
是我刚刚调用updatea()
时记录的对象,但在原始点击功能中是Object
,当我调用updateb.apply(this)
或updatec()
时({1}}引用self
)。