【问题标题】:KnockoutJS - Update ViewModel / Mapping PluginKnockoutJS - 更新 ViewModel / 映射插件
【发布时间】:2012-07-31 11:50:26
【问题描述】:

如何更新完整的 viewModel ?

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

如果我使用ko.applyBindings(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;
    },
};

【问题讨论】:

  • 您也可以发布您的 viewModel 代码吗? domElement 是可观察的吗?

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


【解决方案1】:

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

这应该意味着你可以说:

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

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

【讨论】:

  • +1 这很好用。但有一件事是行不通的。我有一个 customBinding 并且它没有得到更新(停止工作)。有什么想法吗?
  • 您能发布您的自定义绑定实现吗?
  • @dknaack:确保您不要再拨打ko.applyBindings。每个视图只应该调用一次。
  • 你能举个例子说明你是如何绑定数据的吗?例如:data-bind="viewModel" ?
  • @Vyache 更新后您无需更改数据绑定 - 它们会自动更新
【解决方案2】:

使用映射插件我做到了

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

就是这样。

【讨论】:

    猜你喜欢
    • 2012-03-06
    • 2013-07-02
    • 2015-07-04
    • 2012-04-30
    • 2015-08-25
    • 2012-08-29
    • 2012-12-18
    • 1970-01-01
    • 2012-08-12
    相关资源
    最近更新 更多