7

我知道你可以在 knockout.js 中创建 2 路绑定。一旦您更改视图,这会更改 javascript 中的模型,反之亦然。我需要一种方法来通知并将此更改发送回服务器。所以我几乎需要在服务器上发布一个帖子。我怎样才能做到这一点?

我的意思是,我需要以某种方式附加一个事件处理程序,因此每当我更改一次模型时,它会自动将更改回传到服务器。

4

3 回答 3

15
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()
            }
        });
    });
}

您不需要为每个视图模型属性单独“手动订阅”。只需定义一个ko.computed. 所有ko.computed的 s 都会被自动通知它们所依赖的 observables 的变化。在上面的代码中,计算取决于 value1 和 value2 可观察对象(在datajQuery$.ajax函数的参数中)。每当 observable 的值发生变化时,包装的ko.computed函数就会执行,并将新值提交给服务器。

于 2012-10-31T18:55:39.397 回答
1

手动订阅怎么样?

  • 可以将手动订阅视为视图模型的绑定。绑定允许您的 UI 对视图模型中的更改做出反应,而手动订阅允许您的视图模型对自身的更改做出反应。这可能意味着对视图模型中的其他相关对象进行更新。

  • 一个常见的例子是当另一个 observable 发生变化时通过 AJAX 触发对 observable 的更新,例如选中复选框或更改下拉值时。在这种情况下,手动订阅就像一个异步计算的 observable。

于 2012-10-31T17:33:41.930 回答
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();
        }
    });
}
于 2012-10-31T15:53:31.543 回答