http://jsfiddle.net/FZ6K6/24/
我有一个带有enable和css绑定的按钮(移除输入),当一个可观察的数组包含两个以上的项时,这些绑定将返回。
<button data-bind="click: removeInput, enable: Integers().length >2, css { red: Integers().length >2 }">Remove Input</button>我还有一个函数(loadIntegerSorter),它将可观察的数组设置为包含两个项。
self.loadIntegerSorter = function () {
self.Integers([new integer(0, 0, 0), new integer(0, 0, 0)]);
};我还有一个通过ajax提交的保存函数。在成功回调中,调用loadIntegerSorter。
success: function (result) {
if (result.Status == "success") {
isvm.loadSortedIntegers();
}
}但是,这似乎破坏了启用绑定。CSS绑定与数组items = 2的行为如出一辙,但Enable绑定没有。我可以在Ajax函数之外成功地运行loadIntegerSorter,所以我认为这是一个同步问题,但我不知道解决方案是什么。
我所链接的小提琴并没有充分演示这个问题,因为它依赖于发出真正的Ajax请求。但我希望它能显示出足够的理解力。
精化:
这导致了enable绑定的预期行为:
self.save = function () {
self.isloading();
};但这并不是:
self.save = function () {
$.ajax("/Home/Index", {
data: ko.toJSON(self.integerSorter),
cache: false,
type: "post",
contentType: "application/json",
context: self,
success: function (result) {
this.isloading();
}
});
};这一点也不是:
self.save = function () {
self.isloading();
$.ajax("/Home/Index", {
data: ko.toJSON(self.integerSorter),
cache: false,
type: "post",
contentType: "application/json",
context: self,
success: function (result) {
}
});
};不管问题的原因是什么,它似乎都与ajax调用有关。
发布于 2013-12-08 21:31:47
1)
在您正在调用的self.save函数中
self.isLoading(true);产额
TypeError:“未定义”不是一个函数(计算'self.isLoading(true)')
告诉您,代码中的任何地方都没有声明self.isLoading。这甚至会在发送ajax请求之前中断代码执行。
2)
与1)相同,但这次是针对self.msgbox.status()的。未声明:将破坏您的代码。
3)
函数self.loadIntegerSorter在success函数中显示为self.loadSortedIntegers。另外,self.save函数会出现两次声明。第二个人将驾驶第一个,但我想第一个是在那里的小提琴。
4)
在成功函数中,result.Status没有任何意义。您必须理解,result只是一串纯文本,访问字符串的Status属性将导致错误。也许您希望响应是一个带有Status属性的JSON对象?如果是这样的话,您必须自己反序列化字符串(JSON.parse(response)),或者让jQuery为您做到这一点(将$.ajax替换为$.getJSON)。
但是,也可能是您没有收到任何JSON,您只是想访问响应状态,假设您可以这样做。在成功函数中,您已经知道您的请求已被成功发送,并收到了响应。不用再检查了。
5)
在变量loadSortedIntegers()上调用isvm方法。这是一个完全错误的方法,即使它现在应该工作,它可能会在未来造成巨大的麻烦。isvm是一个全局变量,用于包含viewModel的实例。成功函数包含在viewModel本身中,您应该使用this或self访问它自己的方法。类不应使用全局变量访问自身的实例。问:如何使this和/或self在成功函数中可用?可以通过将context属性设置为$.ajax对象来达到this。正如您编写success: function(){}一样,您应该在此之前编写context: this,或者,在您的情况下,编写context: self。
这样做,然后用this.loadSortedIntegers()更改成功函数的内容。
我冒昧地对你的小提琴做了些修改。花时间检查不同的这里并运行它这里。
发布于 2013-12-08 21:18:54
尝试使用valueHasMutated推送可直接观察到的更新:
self.loadIntegerSorter = function () {
self.Integers([new integer(0, 0, 0), new integer(0, 0, 0)]);
self.Integers.valueHasMutated();
};https://stackoverflow.com/questions/20459012
复制相似问题