【问题标题】:Knockout Mapping Plugin and Data-Bind from Simple JSON来自简单 JSON 的淘汰赛映射插件和数据绑定
【发布时间】:2013-10-09 21:39:20
【问题描述】:

我在弄清楚为什么这个简单的 Knockout 映射不起作用时遇到了一些问题。我不确定返回的 JSON 是否无效,或者我的映射是否错误,或者只是绑定。

数据结构是一个父 Conversation 对象和一个 Message 对象数组。

关于我正在使用 foreach 的绑定:目前正在对话,因为如果我将整个事物包装为单个元素数组,我就有此工作。

我的绑定

<div data-bind="foreach: conversation">
  <div data-bind="foreach: messages">
    <div class="well"> 
      <div data-bind="text: sender_name"></div> 
      <div data-bind="text: subject"></div>
      <div data-bind="text: body"></div>
      <div data-bind="text: updated_at"></div> 
    </div>    
  </div>
</div>  

我的 ViewModel、伪造的 JSON 和映射

// Sample JSON to return for initialization; 2 second delay

var conversationData = {
  json: $.toJSON(
        {"id":8,"subject":"Hello JB! Email two!",
         "updated_at":"Sep 27",
         "originator":"James Pablo",
         "count_messages":"(2)",
         "messages":[{"subject":"RE: Hello JB! Email two!",
                      "body":"Thanks for the message!",
                      "sender_name":"Joe Flynn","updated_at":"Sep 27"},
                     {"subject":"Hello JB! Email two!",
                      "body":"Body text",
                      "sender_name":"James Pablo",
                      "updated_at":"Sep 27"}
                    ]
        }
  ),
  delay: 1
}



function Conversation(data) {
    ko.mapping.fromJS(data, {}, this);
}

function Message(data) {    
    ko.mapping.fromJS(data, {}, this);
}

var map = {
  create: function(options) {
    return new Conversation(options.data);
  },
  messages: function(options) { 
    return new Message(options.data);
  }
}


var ViewModel = function() {
  var self = this;
  self.conversation = ko.observable();

  // Use JSFiddle echo to simulate an AJAX service
  (function() {
    $.ajax({ url:"/echo/json/", data:conversationData, type:"POST",
             success:function(data)
             {
               // Map the returned JSON to the View Model  
               ko.mapping.fromJS(data, map, self.conversation);
             }
           });
   })();  

   console.log(self.conversation());

};

ko.applyBindings(new ViewModel());

This JSFiddle 在我返回包装在单个元素数组中的 JSON 数据时有效。

如果我从 JSFiddle 中的 JSON 中删除数组包装器(这是我想要的,因为我只想呈现单个对话),那么我无法让它工作。有什么想法吗?

【问题讨论】:

    标签: json data-binding knockout.js knockout-mapping-plugin


    【解决方案1】:

    Create 函数仅适用于数组。

    试试这个

    http://jsfiddle.net/C46pU/2/

    从地图文字中删除约定并做到了

    self.conversation(new Conversation(data));
    

    【讨论】:

    • 谢谢安德斯。那么约定是对不同的场景使用不同的映射吗?如果我正在处理一系列对话,我应该使用原始映射,而如果我正在处理单个对话,我应该使用修改后的映射?我希望使用单个映射来定义数据结构。你知道这是否记录在任何地方?我在 [link]knockoutjs.com/documentation/plugins-mapping.html 中看不到它
    • 那你就不能一直使用数组吗,即使只是一次对话?
    • 你也不能深度嵌套映射文字,每次你做 ko.mapping.fromJS() 时都需要提供它
    猜你喜欢
    • 2014-03-20
    • 2014-03-26
    • 2013-05-27
    • 2012-09-05
    • 1970-01-01
    • 2012-11-04
    • 2016-02-12
    • 1970-01-01
    • 2013-07-16
    相关资源
    最近更新 更多