我知道你可以在knockout.js中创建双向绑定。一旦您更改视图,这将在javascript中更改模型。我需要一种方法来通知并将此更改发送回服务器。所以我非常需要在服务器上发帖子。我怎么能这样做?
我的意思是,我需要附加一个事件处理程序,所以每当我更改一次模型时,它会自动将更改发回给服务器。
答案 0 :(得分:14)
function MyViewModel() {
var self = this;
self.value1 = ko.observable();
self.value2 = ko.observable();
ko.computed(function() {
$.ajax({
url: '/path/to/server/endpoint',
type: 'POST',
data: {
value1: self.value1(),
value2: self.value2()
}
});
});
}
您不应该需要个人"手动订阅"对于每个viewmodel属性。只需定义ko.computed
即可。所有ko.computed
都会自动通知他们所依赖的可观察对象的更改。在上面的代码中,计算取决于value1和value2 observables(在jQuery data
函数的$.ajax
参数中)。只要observable的值发生更改,就会执行包装的ko.computed
函数,并将新值提交给服务器。
答案 1 :(得分:1)
可以将手动订阅视为视图模型的绑定。绑定允许您的UI对视图模型中的更改做出反应,而手动订阅允许您的视图模型对自身的更改做出反应。这可能意味着在视图模型中更新其他相关对象。
一个常见示例是当另一个可观察的更改时,例如选中复选框或更改下拉列值时,通过AJAX触发对observable的更新。在这种情况下,手动订阅的作用类似于异步计算的observable。
答案 2 :(得分:0)
我是通过json(只有一种方式)来做的:
从json String加载你的ko绑定(例子):
userSettingsModel = ko.mapping.fromJSON('${userSettingsJSON}');
ko.applyBindings(userSettingsModel);
将更改后的ko对象发送回服务器(示例):
function saveConferencesFilter() {
// console.log(ko.mapping.toJSON(userSettingsModel));
$.ajax({
type: 'PUT',
url: '/AudioPlace/userSettings/rest',
dataType: 'json',
contentType: 'application/json;charset=UTF-8',
data: ko.mapping.toJSON(userSettingsModel),
success: function (data) {
getConferences();
}
});
}