手动订阅和调用updateFromJS会导致死锁
Manually subscribe and call updateFromJS causes dead-lock
下面有一些代码,以确保用户不需要单击任何按钮并将所有输入更新到服务器端。服务器端代码负责执行任何计算并将更新的JSON发送回客户端。
这里的问题是手动订阅代码将检测用户输入的变化,它将调用一个函数将JSON数据发送到服务器并从服务器接收JSON。从这里开始,它将尝试通过调用ko.mapping.updateFromJS(viewModel, data);
来更新视图模型,但是这里发生了死锁。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;
}
相关文章:
- Meteor-在一段时间内解锁模板(按日期)
- 如何编写一个不死边界的变量
- 使用 jQuery 锁定和解锁页面
- 给定一个4位锁,其中每个数字可以是0、1、2、3或4,我如何计算所有加起来为4的组合
- 在模型上使用beforeCreate和findOrCreate与Sequelize发生死锁
- 解锁英特尔xdk中的屏幕
- 正在删除捆绑死代码
- Imacros/jQuery TypeError:无法访问死对象,第 816 行(错误代码:-991)
- 尝试设置请求指针锁()时似乎有问题
- 锁的基本逻辑 - 互斥
- jQuery blockUI 不会解锁
- 当设备被锁定时,停止播放HTML5音频(Android和iOS)
- 死链接:链接在新窗口中打开,但不在页面上打开
- 多个带锁的 if 语句
- Firefox 扩展中的同步机制(例如锁)
- 没有全屏 API 的指针锁
- Ionic Web API Audio() 在 iOS 上,当屏幕锁定时
- 在网站上使用Javascript检测解锁屏幕
- 解锁流星注销并登录
- 手动订阅和调用updateFromJS会导致死锁