javascript - 在 Ember.js 中从服务器中提取简单的只读字符串数组

标签 javascript arrays ember.js

是否可以从服务器中提取一个简单的 JSON 数组并将其用作 Ember 应用程序中的“常量查找表”?

我有一个 Rails Controller ,它返回一个简单的字符串数组:[“项目一”、“项目二”、“项目三”、...]。我希望它们成为成熟的 Ember 模型,也不希望将它们表示为键:值对数组(即 [ {name: "项目一"}, {name: "项目二"}, {name: "项目三"}, ...])

如何只提取 JSON 数组一次,然后在我的应用程序中引用它?

首先,我尝试在 Controller 上声明一个属性,然后通过 {{each}} 标签在 Handlebars 中呈现:

Controller :

window.App.SimpleController = Ember.Controller.extend(
  words: (() ->
    Ember.$.getJSON("http://localhost:3000/dictionary")
  ).property()
)

模板:

{{#each words}}
    {{this}}
{{/each}}

Ember 提示这不是一个数组,而是 jQuery Promise 对象:

Uncaught Error: Assertion Failed: The value that #each loops over must be an Array. You passed {readyState: 1, getResponseHeader: ...

这也令人困惑 - 我认为 Ember 将 Promise 作为数组处理?

最佳答案

Ember 处理返回到模型 Hook 的 Promise,而不是返回到计算属性的 Promise。您要么想要在路由中设置它,要么使用 promise 代理设置计算属性。

最常见的模式是在路由中获取和设置数据,但如果您想将其作为 Controller 中的计算属性来执行,则可以使用代理模式。 Ember Data 使用 Ember 本身的类来设置他们的 Promise 代理。

如果服务器的响应是一个对象,您的计算属性可能如下所示:

words: (() ->
  var foo = Ember.ObjectProxy.extend(Ember.PromiseProxyMixin),
      promise = Ember.$.getJSON("http://localhost:3000/dictionary");
  foo.create({ promise: promise });
).property()

如果您的响应是一个数组,您将设置一个数组代理

words: (() ->
  var foo = Ember.ArrayProxy.extend(Ember.PromiseProxyMixin),
      promise = Ember.$.getJSON("http://localhost:3000/dictionary");
  foo.create({ promise: promise });
).property()

如果它是一个数组,则有另一种模式返回数组引用,然后稍后填充它。

words: (() ->
  var foo = [],
      promise = Ember.$.getJSON("http://localhost:3000/dictionary");

  foo.then(function(data){ // this happens asynchronously
    data.forEach(function(item){
      foo.pushObject(item);
    });
  });

  return foo;
).property()

然后最简单的就是在路由过程中设置属性:EmberJS: How to load multiple models on the same route?

关于javascript - 在 Ember.js 中从服务器中提取简单的只读字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25734639/

相关文章:

javascript - 我根据规范进行的chip8实现与互联网上的开源代码不同。需要澄清

javascript - Raphael - 动画后保存 svg 元素的属性

c - 作业 : In C, 如何仅使用指针获取数组的子串?

sql - 在 Oracle 中,如何对多个数组使用 IN 子句?

javascript - 使用 D3.js 创建矩形图表

arrays - 使用 dlmread 读取许多(1000+)文件 - 循环使用不同的文件名?

javascript - 属性 :desc is not the same as reverse 上的 Ember sortBy

javascript - ember.js + Handlebars : render vs outlet vs partial vs view vs control

javascript - Ember.js 如何拦截和过滤传递给 Ember.Object.create(params) 的参数

用于幻灯片放映的 Javascript 无法正常工作