【问题标题】:how to add new item using knockout mapping plugin如何使用淘汰映射插件添加新项目
【发布时间】:2012-08-01 00:36:12
【问题描述】:

我正在尝试一个淘汰制映射示例,并认为我快到了。我似乎无法向 viewModel.foos 添加新的 Foo - 谁能看到我在这里错过了什么?

var Foo = function (data) {

    var self = this;
    self.id = data.id;
    self.Name = ko.observable(data.Name);

}

var dataMappingOptions = {
    key: function(data) {
        return data.id;        
    },
    create: function (options) {

        return new Foo(options.data);
    }
};


var viewModel = {

    foos: ko.mapping.fromJS([]),
    loadInitialData: function () {
        ko.mapping.fromJS(serverData, dataMappingOptions, viewModel.foos);
    },
    loadUpdatedData: function () {
        ko.mapping.fromJS(serverData, dataMappingOptions, viewModel.foos);
    }
};

viewModel.addFoo = function () {
    viewModel.foos.push(ko.mapping.fromJS(new Foo()));
    viewModel.loadUpdatedData();
}


    <ul data-bind="template: {name: 'TopTemplate'}"></ul>
<script type="text/html" id="TopTemplate">
    <li><span>Result</span>
        <ul data-bind=" template: {name:  'FooTemplate' , foreach: foos} " style="list-style-type:circle;margin-left:15px">
        </ul>
    </li>
    <button data-bind='click: addFoo'>Add Foo</button>
</script>       
<script type="text/html" id="FooTemplate">     
    <li><span data-bind='text: Name'></span>

    </li>

</script>

【问题讨论】:

    标签: knockout.js knockout-mapping-plugin


    【解决方案1】:

    您可以直接将一个新的 Foo 推送到您的 observableArray。

    这是一个加载一些初始数据然后加载一些更新数据以及一个按钮以在客户端添加新项目的示例。 http://jsfiddle.net/rniemeyer/wRwc4/

    var viewModel = {
        foos: ko.mapping.fromJS([]),
        loadInitialData: function() {
            ko.mapping.fromJS(initialData, dataMappingOptions, viewModel.foos);
        },
        loadUpdatedData: function() {
            ko.mapping.fromJS(updatedData, viewModel.foos);
        }
    };
    
    viewModel.addFoo = function() {
        viewModel.foos.push(new Foo({ id: 0, Name: "New" }));
    };
    

    【讨论】:

    • 非常感谢您的帮助(以及其他问题:))
    【解决方案2】:

    由于原始海报在 Foo 类成员中应用 observables,因此无需对其应用 ko.mapping.fromJS。但是我发现,当您有一个需要添加到可观察数组的“原始”json 对象(没有映射)时(即您之前已应用 ko.mapping.fromJS()),您确实需要执行ko.mapping.fromJS 例如

    myArray.push(ko.mapping.fromJS(myNewRawJsonItem));  
    

    否则你的模板绑定(如果有的话)会报错“TypeError xxxx 不是一个函数”。

    【讨论】:

    • 你是一个救生员。我想知道为什么它会抛出那个错误。非常感谢。
    猜你喜欢
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 2012-04-13
    • 2015-06-07
    • 2014-09-12
    • 1970-01-01
    相关资源
    最近更新 更多