KnockoutJS - 更新ViewModel / Mapping插件

时间:2012-08-02 13:37:47

标签: javascript knockout.js knockout-mapping-plugin

如何更新完整的viewModel?

  1. 在页面加载时,我会获得一个模型并使用ko.mapping.fromJS(myObject)将其转换为viewModel。
  2. 如果用户点击按钮,我想从服务器获取更新数据
  3. 现在我想申请theese的更新
  4. 如果我使用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(); 
    });
    

    更新

      

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

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

2 个答案:

答案 0 :(得分:10)

如果查看mapping documentation上的“指定更新目标”,则可以指定映射的目标。

这应该意味着你可以说:

if (!viewModel)
   viewModel = ko.mapping.fromJS(data);
else
   ko.mapping.fromJS(data, {}, viewModel); 

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

答案 1 :(得分:3)

使用映射插件我做了这个

ko.mapping.fromJS(JsonResponse, myObservable());

就是这样。