KnockoutJS - 更新ViewModel/Mapping插件

dkn*_*ack 9 javascript knockout-mapping-plugin knockout.js

如何更新完整的viewModel?

  1. 在页面加载时,我得到一个模型并将其转换ko.mapping.fromJS(myObject)为viewModel.
  2. 如果用户单击按钮,我想从服务器获取更新的数据
  3. 现在我想应用theese更新

如果我使用ko.applyBindings(viewModel);它完美更新ui.但它再次增加了相同的事件.因此,如果用户单击该按钮,则会触发事件两次,第三次,依此类推.

更新完整viewModel的好方法是什么.也许我删除绑定并再次应用它们?(这该怎么做).

样品

var viewModel;

function update() 
{
    $.ajax({
        url: '...',
        type: "GET",
        statusCode: {
            200: function (data) {
                 viewModel = ko.mapping.fromJS(data);
                 ko.applyBindings(viewModel);
            }
        }
    });    
}

// first call after page load
update();

// user click
$("#myButton").click(function() {
    update(); 
});
Run Code Online (Sandbox Code Playgroud)

更新

Steve Greatrex您可以发布自定义绑定实现吗?

ko.bindingHandlers.domBinding = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        viewModel.domElement = element;
    },
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        viewModel.domElement = element;
    },
};
Run Code Online (Sandbox Code Playgroud)

Ste*_*rex 10

如果查看映射文档中的"指定更新目标",则可以指定映射的目标.

这应该意味着你可以说:

if (!viewModel)
   viewModel = ko.mapping.fromJS(data);
else
   ko.mapping.fromJS(data, {}, viewModel); 
Run Code Online (Sandbox Code Playgroud)

这样,您将在初始加载时创建视图模型,然后为任何后续加载更新该视图模型.