【问题标题】:Unable to map the Data using mapping plugin ? Knockout无法使用映射插件映射数据?昏死
【发布时间】:2015-01-21 08:36:40
【问题描述】:

我正在尝试将我的数据绑定到视图,但我的所有尝试都没有成功。

有一个数据数组我存储在一个变量中,稍后使用映射插件,我将这些数据作为可观察的以将其绑定到视图。

这里有趣的是我在console 中没有收到任何错误,我检查了

<span data-bind="text: ko.toJSON(Item)"></span> 

我可以看到我的数组,但我看不到它绑定到视图。

脚本代码:

console.log(ko.mapping.fromJS(jsonData));
var viewModel = new MainModel();
viewModel.Item(ko.mapping.fromJS(jsonData));
ko.applyBindings(viewModel);

小提琴链接是Here

这是我在映射插件上的第一次尝试。请建议我参考以使用映射插件构建一些复杂的东西。

如果是,建议使用任何更好的方法。

【问题讨论】:

    标签: knockout.js knockout-mapping-plugin


    【解决方案1】:

    我不记得了,但这与我两天前提出的问题相同。

    我想如果你想要类似的问题,我已经解决了它,你可以在你更新的小提琴上找到它。我还将淘汰版更新到 3.2.0。

    http://jsfiddle.net/C46pU/9/

    var mapping = {
        'Items': {
            create: function(options) {
                console.log('Inside Mapping Item');
                return new ChildModel(options.data);
            }
        },
         'Value': {
             create: function(options){
                      console.log('Inside Mapping Value');
                      return new ChildModel(options.data);
             }
           }
     };
    
    $(document).ready(function () {
    
               var jsonData = {"Items":[{"Value":[{"Value1":"1","Value2":"2"},{"Value1":"3","Value2":"4"}]},{"SelectedOption":["Item2"],"Value":[{"Value1":"5","Value2":"6"},{"Value1":"7","Value2":"8"},{"Value1":"9","Value2":"10"}]}]};
    
             var viewModel = new MainModel(jsonData);                    
             ko.applyBindings(viewModel);                         
            });
    
            function ValueModel() {
                var self = this;
                self.Value1 = ko.observable();
                self.Value2 = ko.observable();
            }
    
            function ChildModel(data) {
                var self = this;
                self.SelectedOption = ko.observable();
                self.Value = ko.observableArray([]);
                if(data != null)
                {
                    console.log(data);
                    ko.mapping.fromJS(data,mapping,self);
                }
                self.AddValue = function () {
                    self.Value.push(new ValueModel());
                }
            }
    
    
            function MainModel(data) {
                var self = this;            
                self.Items = ko.observableArray([]);
                if(data != null)
                {
                    console.log('Inside Main Model');
                    console.log(data);
                    ko.mapping.fromJS(data,mapping, self);
                }           
    
                self.dropDownItem = ko.observableArray(['Item1', 'Item2', 'Item3', 'Item4']);
    
                self.AddItem = function () {
                    self.Items.push(new ChildModel());
                }
            }
    

    【讨论】:

    • 他是的,是你的问题伙伴。我已经为这个问题添加了书签,以分析映射的工作原理,因为我刚刚开始使用映射插件,但我猜你删除了帖子。
    • 代码中的小错别字,请您编辑。在添加操作self.items 中,该 div 块显示 preview 是相同的。欢呼它非常有帮助。
    【解决方案2】:

    我已经修改了您的小提琴,添加了“映射”定义和其他一些更改(我害怕丢失源,因此我将它们发布在这里)。

    主要是

    var mapping = {
        'Item': {
            create: function(options) {
                return new ChildModel(options.data);
            }
        }
    } 
    

    映射插件将被强制使用某些对象创建函数,然后反序列化您的 cild 模型。

    标记:

        <h2>Nested</h2>
    <table  cellpadding="10" cellspacing="5" style="padding:10px;">
        <tbody data-bind="foreach: Item">
        <tr >
            <td>
                <select data-bind="options: $root.dropDownItem, selectedOptions: $data.SelectedOption && SelectedOption() || ''"></select>
            </td>
            <td>
                <input type="button" data-bind="click: AddValue" value="Add Value" />
            </td>
            <td>
                <table data-bind="foreach: Value">
                    <tr>
                        <td><input type="text" data-bind="value: Value1" /></td>
                        <td><input type="text" data-bind="value: Value2"/></td>
                    </tr>
                </table>
            </td>
        </tr>
        </tbody>
    </table>
    <div>
        <input type="button" value="Add Item" data-bind="click: AddItem" />
    </div>
    <div>
        <span data-bind="text: ko.toJSON(Item)"></span>
    </div>
    

    代码:

     $(document).ready(function () {
    
               var jsonData = {"Item":[{"Value":[{"Value1":"1","Value2":"2"},{"Value1":"3","Value2":"4"}]},{"SelectedOption":["Item2"],"Value":[{"Value1":"5","Value2":"6"},{"Value1":"7","Value2":"8"},{"Value1":"9","Value2":"10"}]}]};
    var mapping = {
        'Item': {
            create: function(options) {
                return new ChildModel(options.data);
            }
        }
    }
         var viewModel = new MainModel();
              viewModel.Item(ko.mapping.fromJS(jsonData, mapping).Item());
    ko.applyBindings(viewModel);    
    
            });
    
            function ValueModel() {
                var self = this;
                self.Value1 = ko.observable();
                self.Value2 = ko.observable();
            }
    
            function ChildModel() {
                var self = this;
                self.SelectedOption = ko.observable();
                self.Value = ko.observableArray([new ValueModel()]);
    
                self.AddValue = function () {
                    self.Value.push(new ValueModel());
                }
            }
    
    
            function MainModel() {
                var self = this;            
                self.Item = ko.observableArray([]);
    
                init();
    
                function init() {
                    self.Item.push(new ChildModel());                
                }
    
                self.dropDownItem = ko.observableArray(['Item1', 'Item2', 'Item3', 'Item4']);
    
                self.AddItem = function () {
                    self.Item.push(new ChildModel());
                }
            }
    

    希望,它会有所帮助。

    【讨论】:

    • 感谢 TSV,这是一个知识渊博的信息 :) 赞赏
    猜你喜欢
    • 2014-03-04
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2015-10-21
    • 2017-10-12
    • 2022-12-07
    相关资源
    最近更新 更多