是否可以从服务器中提取一个简单的 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/