首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在通过Ajax成功回调更新可观察到的数组时启用绑定中断

在通过Ajax成功回调更新可观察到的数组时启用绑定中断
EN

Stack Overflow用户
提问于 2013-12-08 21:00:26
回答 2查看 152关注 0票数 2

http://jsfiddle.net/FZ6K6/24/

我有一个带有enable和css绑定的按钮(移除输入),当一个可观察的数组包含两个以上的项时,这些绑定将返回。

代码语言:javascript
运行
复制
<button data-bind="click: removeInput, enable: Integers().length >2, css { red: Integers().length >2 }">Remove Input</button>

我还有一个函数(loadIntegerSorter),它将可观察的数组设置为包含两个项。

代码语言:javascript
运行
复制
self.loadIntegerSorter = function () {
    self.Integers([new integer(0, 0, 0), new integer(0, 0, 0)]);
};

我还有一个通过ajax提交的保存函数。在成功回调中,调用loadIntegerSorter。

代码语言:javascript
运行
复制
success: function (result) {
    if (result.Status == "success") {
        isvm.loadSortedIntegers();
    }
}

但是,这似乎破坏了启用绑定。CSS绑定与数组items = 2的行为如出一辙,但Enable绑定没有。我可以在Ajax函数之外成功地运行loadIntegerSorter,所以我认为这是一个同步问题,但我不知道解决方案是什么。

我所链接的小提琴并没有充分演示这个问题,因为它依赖于发出真正的Ajax请求。但我希望它能显示出足够的理解力。

精化:

这导致了enable绑定的预期行为:

代码语言:javascript
运行
复制
self.save = function () {
    self.isloading();
};

但这并不是:

代码语言:javascript
运行
复制
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();
        }
    });
};

这一点也不是:

代码语言:javascript
运行
复制
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调用有关。

EN

回答 2

Stack Overflow用户

发布于 2013-12-08 21:31:47

1)

在您正在调用的self.save函数中

代码语言:javascript
运行
复制
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本身中,您应该使用thisself访问它自己的方法。类不应使用全局变量访问自身的实例。问:如何使this和/或self在成功函数中可用?可以通过将context属性设置为$.ajax对象来达到this。正如您编写success: function(){}一样,您应该在此之前编写context: this,或者,在您的情况下,编写context: self

这样做,然后用this.loadSortedIntegers()更改成功函数的内容。

我冒昧地对你的小提琴做了些修改。花时间检查不同的这里并运行它这里

票数 1
EN

Stack Overflow用户

发布于 2013-12-08 21:18:54

尝试使用valueHasMutated推送可直接观察到的更新:

代码语言:javascript
运行
复制
self.loadIntegerSorter = function () {
    self.Integers([new integer(0, 0, 0), new integer(0, 0, 0)]);
    self.Integers.valueHasMutated();

};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20459012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档