【问题标题】:Knockout Template Binding Not Updating UI敲除模板绑定不更新 UI
【发布时间】:2013-10-02 18:20:02
【问题描述】:

我有绑定到我的模型的递归模板。问题是我一次修改一个对象,所以如果我单击下一个对象并尝试加载新对象,模板不会更新。

我的模板:

  <div class="portlet-body" id="details-container" data-bind="template: { name: 'packageTemplate', data: viewModel.packageElements() }"></div>

我的模特:

var viewModel;
function packageElementViewModel(data) {
    var self = this;
    self.packageElements = ko.observable({ Description: ko.observable(), Children:        ko.observableArray() });
}

我的初始化:

$.ajax({
    'type': 'POST',
    'url': 'http://www.someurl.com/',
    'data': { PackageId: 1},
    'success': function (data) {
        viewModel.packageElements = ko.observable(ko.mapping.fromJS(data));
        ko.applyBindings(viewModel);
    });

当我选择一个新包时,我调用此代码并更新变量,但 UI 没有更新。:

        var id = PackageSummary.packageTable.fnGetData($(this).get(0))['Id'];
        $.ajax({
            'type': 'POST',
            'url': 'http://www.someurl.com',
            'data': { PackageId: id },
            'success': function (data) {
                viewModel.packageElements = ko.observable(ko.mapping.fromJS(data));
            },
            'error': function (XMLHttpRequest, textStatus, errorThrown) {
                alert(XMLHttpRequest.responseText);
            }
        });

这是我的数据:

    {
        "Description":"Top",
        "Children":[
            {
                "Description":"Second-Level 1",
                "Children":[
                    {
                        "Description":"Third Level 1",
                        "Children":[]
                    },
                    {
                        "Description":"Third Level 2",
                        "Children":[]
                    },          
                    {
                        "Description":"Third Level 3",
                        "Children":[]
                    }
                ]
            },
            {
                "Description":"Second Level 2":[
                    {
                        "Description":"Third Level 1",
                        "Children":[]
                    },
                    {
                        "Description":"Third Level 2",
                        "Children":[]
                    },
                    {
                        "Description":"Third Level 3",
                        "Children":[]
                    }
                ]
            }
        ]
    }

【问题讨论】:

    标签: javascript templates data-binding knockout.js knockout-mapping-plugin


    【解决方案1】:

    我相信问题是您在 ajax 调用的成功方法中重置 packageElements

    'success': function (data) {
         viewModel.packageElements = ko.observable(ko.mapping.fromJS(data));
    }
    

    这破坏了与您调用 ko.applyBindings(viewModel) 时设置的元素的绑定

    您想要做的只是在 viewModel 中已经存在的 observables 上设置 DescriptionChildren 属性

    'success': function (data) {
        viewModel.packageElements().Description(data.Description);
        viewModel.packageElements().Children(data.Children);
    }
    

    我做了一个例子,基本上做同样的事情,但数据不同。 http://jsfiddle.net/vGuHU/

    另外,作为旁注。从您发布的代码来看,packageElements 没有真正的理由成为ko.observable()

    【讨论】:

    • 感谢工作喜欢一个魅力。我不知道为什么我犯了这么愚蠢的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2020-10-08
    • 1970-01-01
    相关资源
    最近更新 更多