【问题标题】:Format JSON ojects for Ember / drill-down / serialize / adapter为 Ember/向下钻取/序列化/适配器格式化 JSON 对象
【发布时间】:2015-04-04 10:22:22
【问题描述】:

我正在使用 ajax 提取一些 JSON(因为我对 RESTAdapter 的理解有限/缺乏有用的示例/无法通过 CORS...) - 我得到了这些嵌套对象。我需要一组“书”——但我不确定如何格式化这个 JSON 以便它可读。


路线/books.js

import Ember from 'ember';
import ajax from 'ic-ajax';

var libraryThingApi = "http://www.librarything.com/api_getdata.php?";

export default Ember.Route.extend({

  model: function() {

    var libraryData = ajax({
      url: libraryThingApi + "userid=F.L.O.W.",
      type: 'GET',
      dataType: 'jsonp'
    });

    console.log(libraryData);
    return libraryData;
  }

});


返回什么

Promise
  _id: 47
  _label: "ic-ajax: unwrap raw ajax response"
  ...
  _result: Object
    books: Object
      111333266: Object
        title: "a book title"
      111730480: Object
        title: "a book title"
    settings: Object
      theuser: "F.L.O.W."
      more_things: "etc"


{
  books: {
    111601539: {
      book_id: "111601539",
      title: "Rosie Revere, Engineer",
      author_fl: "Andrea Beaty",
      copies: 1
    },
    121604536: {
      book_id: "121604536",
      title: "Ember for people who aren't core.",
      author_fl: "No author",
      copies: "This book does not exist"
    }
  },
  settings: {
     theuser: "sheriffderek"
  }
}

【问题讨论】:

    标签: javascript json ember.js


    【解决方案1】:

    由于您只是获取原始 json,因此您可以随心所欲地使用它。然后就变成了您希望如何访问路线模板中的数据的问题。

    Ember 的模型钩子可以感知 Promise,因此您只需返回 Promise 是正确的。该承诺的实现价值就是您对模板感兴趣的内容。因此,如果完成的值是这样的:

    {
      books: [
        {id: 1, title: "some title", nested_data: {author: "some author"}},
        {id: 2, title: "another title", nested_data: {author: "another author"}},
      ]
    }
    

    然后在您的路由模板中,您可以从模型钩子中返回的承诺访问已实现的值。在 Ember 1.10 之前(稍后在 1.x 系列中不推荐使用),您可以像这样在您的路线模板中浏览您的书籍:

    <ul>
      {{#each book in model.books}}
        <li>{{book.title}} by {{book.nested_data.author}}</li>
      {{/each}}
    </ul>
    

    Ember 1.10 及更高版本为每个语句引入了块参数:

    <ul>
      {{#each model.books as |book|}}
        <li>{{book.title}} by {{book.nested_data.author}}</li>
      {{/each}}
    </ul>
    

    阅读有关 Ember 1.10 版本的信息here

    【讨论】:

    • 所以,我认为问题可能在于此响应中没有常规的 id。 (顺便说一句,我使用的是 Ember 和 EmberCLI 的最新版本)- 我可以访问 {{model.books.116428944.title}},但在循环中,我会收到 The value that #each loops over must be an Array. You passed {116428942: [object Object], .... 我只是在黑暗中打卡...
    • 看来我必须越过嵌套对象或其他东西。添加了更多信息 - 如果您有时间看看。
    • 确实,您尝试迭代的不是数组。您可以将其转换为一个数组(在呈现 JSON 的服务器上,或者在您收到 JSON 后在 javascript 中)您是否可以控制后端如何为 JSON 提供服务?那将是将数据转换为数组的最佳位置。
    • JSON 来自“librarything”的 API……这是有限的。 ::: librarything.com/services
    • 如果您能够更改库提供 JSON 的方式,那么这就是 IMO 建议的路径。但是,人们无法控制他们的后端的情况并不少见,因此您可以在数据进入后对其进行处理。您在哪里执行此操作取决于您,但基本上在您发出 ajax 请求之后,以这种方式转换响应你想要并在你的模型钩子中返回转换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 2011-08-14
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    相关资源
    最近更新 更多