javascript - 手动订阅调用updateFromJS导致死锁

标签 javascript knockout.js

我在下面有一些代码,以确保用户不需要单击任何按钮并将所有输入更新到服务器端。服务器端代码负责执行任何计算并将更新的 JSON 发送回客户端。

这里的问题是手动订阅代码将检测用户输入的更改,它将调用一个函数将 JSON 数据发布到服务器并从服务器接收 JSON。从此时起,它将尝试通过调用 ko.mapping.updateFromJS(viewModel, data); 来更新 View 模型,但这里发生了死锁。 updateFromJS会再次触发手动订阅事件,从而再次调用服务器代码,从而触发另一轮手动订阅。

var initialData = /* get JSON from server side */;

var viewModel = ko.mapping.fromJS(initialData);

ko.applyBindings(viewModel, document.body);

viewModel.Product.Parameter1.subscribe(function(newValue) {
    postToServer();
});

viewModel.Product.Parameter2.subscribe(function(newValue) {
    postToServer();
});

viewModel.Product.Parameter3.subscribe(function(newValue) {
    postToServer();
});

function getProduct() {
    // retrieve JSON data to be posted to server side
}

function postToServer() {
    var product = getProduct();

    $.ajax({
        url: '/Home/ProductUpdate/',
        data: JSON.stringify(product),
        type: "POST",
        dataType: 'json',
        contentType: 'application/json; charset=utf-8',
        success: function (data) {
            // update JSON returned from server side to observable view-model
            ko.mapping.updateFromJS(viewModel, data);
        }
    });
}

是否可以执行以下任一操作:

  • 在调用 ko.mapping.updateFromJS 时禁用手动订阅? (之后继续)。
  • 手动订阅是否会忽略 ko.mapping.updateFromJS 调用触发的事件?

最佳答案

你能用这样的变量来做到这一点吗:

<script language="javascript" type="text/javascript">
var initialData = /* get JSON from server side */;

var viewModel = ko.mapping.fromJS(initialData);

var preventUpdate = false;

ko.applyBindings(viewModel, document.body);

viewModel.Product.Parameter1.subscribe(function(newValue) {
    if (!preventUpdate) postToServer();
});

然后在 postToServer 函数中

success: function (data) {
    // update JSON returned from server side to observable view-model

    preventUpdate = true;
    ko.mapping.updateFromJS(data, viewModel);
    preventUpdate = false;
}

关于javascript - 手动订阅调用updateFromJS导致死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7234231/

相关文章:

javascript - Angular 5 - 指令中的生命周期 Hook

javascript - ReactJS 与 TypeScript 未渲染到 DOM

javascript - jquery 颜色编码

javascript - 使用v-model时调整v-text-field的值

javascript - 如何在剑道网格 UI 中显示总和 groupFooterTemplate

javascript - 你如何阻止人们编辑禁用的输入框?

knockout.js - 如何在knockout.js中列出数据库值?

jquery - 使用 JQuery UI 拖放和 Knockout 筛选结果

javascript - 从两个可观察数组中获取计算值

datepicker - Bootstrap datepicker with knockout.js 数据绑定(bind)