【问题标题】:Knockout.mapping: Does it make ALL nested objects observable?Knockout.mapping:它是否使所有嵌套对象都可观察?
【发布时间】:2013-07-01 06:24:32
【问题描述】:

我对 Knockoutjs 真的很陌生(一般来说对 javascript 不是很好)并且我正在尝试映射 JSON 对象的所有可能的嵌套对象,以便每个人都可以观察到。我的印象是使用 ko.mapping.fromJS 会导致所有对象及其对象都是可观察的。但是,我没有看到这种情况发生。

我在 jsfiddle 中所做的并不是我真正在做的事情,但它确实表明我正在尝试映射一个对象,然后将嵌套值绑定到一个 HTML 跨度。

http://jsfiddle.net/Eves/L5sgW/32/

HTML

<p> <span>Name:</span>
<span data-bind="text:  IntroData.Name))"></span>
</p>    

JS

$(function () {

var ViewModel = function (data) {
    var me = this;
    ko.mapping.fromJS(data, me);

    return me;
};

var stuff = {
    IntroData: {
        Name: 'Test'
    }
};
window.viewModel = ko.mapping.fromJS(new ViewModel(stuff));
ko.applyBindings(window.viewModel);
});

是否只是我必须使用映射选项才能使嵌套对象可观察?如果是这样,如果 JSON 对象如此庞大和复杂(这显然不是)怎么办?是否可以使用一些递归功能来遍历每个对象的嵌套对象以使它们都可观察?

【问题讨论】:

    标签: knockout.js mapping observable


    【解决方案1】:

    您的代码 sn-p 和 jsfiddle 存在几个问题:

    • 小提琴不包含映射插件
    • fiddle 不包含 jQuery(但无论如何都可以删除 jQuery 特定的代码)
    • span 元素是自动关闭的,但不应该是
    • 映射插件需要“额外的映射选项”作为第二个参数,me 应该是第三个参数
    • 您的模型上缺少 InitialLoadOfApplication 函数(尽管我不清楚它的用途是什么)
    • 您在 span 上的 text 绑定有两个不应该存在的杂散括号

    如果我解决了所有这些问题,我最终会得到以下结果(另请参阅 this fiddle):

    <p> 
        <span>Name:</span>
        <span data-bind="text: IntroData.PlanName"></span>
        <button id="update" data-bind="click: InitialLoadOfApplication">Update!</button> 
    </p>
    

    还有这个 Javascript:

    var ViewModel = function (data) {
        var me = this; 
        ko.mapping.fromJS(data, {}, me);
    
        me.InitialLoadOfApplication = function() { alert('loading!'); };
    
        return me;
    };
    
    var stuff = {
        IntroData: {
            PlanName: 'Test'
        }
    };
    
    window.viewModel = ko.mapping.fromJS(new ViewModel(stuff));
    ko.applyBindings(window.viewModel);
    

    关于您的问题,根据我的经验,映射插件可以处理相当复杂的对象。如果你到达它的边界,总会有“额外的映射信息”来处理边缘情况。 The relevant documentation 很好地解释了这些。

    【讨论】:

    • 我好像把我的 jsfiddle 杀了。您使用的版本不反映我打算分享的版本。这是真实的:jsfiddle.net/Eves/L5sgW/32
    • 你确定吗?它看起来非常相似,有几乎相同的问题集(和solution)。
    • 我提供的最后一个链接没有按钮或提及 InitialLoadOfApplication。
    • 是的,你是对的。我错过了你提到的一些事情。我怀疑这个测试不能很好地反映我的实际问题。让我检查几件事
    • 没关系。如果它与这个问题完全不同,您可能需要考虑开始一个新问题。祝你好运!
    猜你喜欢
    • 2013-07-01
    • 2022-11-25
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多