我有一个ember-data模型定义,如下所示:
Sylvius.Filter = DS.Model.extend({
title: DS.attr('string'),
slug: DS.attr('string'),
// Belongs to Atlas
atlas: DS.belongsTo('Sylvius.Atlas'),
// Has images
images: DS.hasMany('Sylvius.Image'),
// May have AtlasExtras
extras: DS.hasMany('Sylvius.AtlasExtra'),
// Structures for this filter
structures: DS.hasMany('Sylvius.Structure'),
// This is the path to the thumbnails sprite.
// Each image will have an index on this sprite
thumbnailUrl: DS.attr('string'),
// How big is each thumbnail?
thumbnailHeight: DS.attr('number'),
thumbnailWidth: DS.attr('number'),
// How big are the images?
imageHeight: DS.attr('number'),
// which image is selected?
selectedImage: DS.belongsTo('Sylvius.Image') …Run Code Online (Sandbox Code Playgroud) 我对一个看似简单的余烬问题感到困惑.我正在使用active_model_serializers元数据序列化从rails控制器序列化我的rails current_user方法,然后使用这个人的临时解决方案提取并将current_user meta json设置为全局ember变量.
App.CustomRESTSerializer = DS.RESTSerializer.extend({
extractMeta: function(loader, type, json) {
var meta;
meta = json[this.configOption(type, 'meta')];
if (!meta) { return; }
Ember.set('App.metaData', meta);
this._super(loader, type, json);
}
});
Run Code Online (Sandbox Code Playgroud)
一切都很好,直到这一点.现在,我可以通过键入App.metaData.current_user以及通过调用特定属性从句柄访问控制台中的current_user信息,即:
{{App.metaData.current_user.email}}
Run Code Online (Sandbox Code Playgroud)
并且该电子邮件属性显示在模板中.当我尝试从ember控制器中访问该全局变量时,问题就出现了.这看起来非常简单,但我似乎无法从任何ember控制器中访问current_user.我试过了:
currentUserBinding: 'App.metaData.current_user',
currentUser: function() {
return App.metaData.current_user;
}.property(),
Ember.get('App.metaData.current_user')
Run Code Online (Sandbox Code Playgroud)
和其他一些方法,但似乎无法访问它.奇怪的是,我可以通过直接路径从控制台和把手内轻松访问current_user,但不能从ember控制器中访问.我一定错过了一些明显的东西.
非常感谢任何帮助!
我有以下型号:
App.Publication = DS.Model.extend({
title: DS.attr('string'),
bodytext: DS.attr('string'),
author: DS.belongsTo('author')
});
App.Author = DS.Model.extend({
name: DS.attr('string')
});
Run Code Online (Sandbox Code Playgroud)
以下是json数据:
{
"publications": [
{
id: '1',
title: 'first title',
bodytext: 'first body',
author_id: 100
},
{
id: '2',
title: 'second title',
bodytext: 'second post',
author_id: 200
}
];
}
Run Code Online (Sandbox Code Playgroud)
在Ember Data RC12中,这有效(您可以在json中指定author_id或作者,并且出版物将始终链接正确的作者).
在Ember Data 1.0.0中,这不再有效; 作者总是空的.
在一些文档中,我发现 - 因为我在json数据中使用"author_id"(而不仅仅是作者) - 我需要在模型中指定键; 从而:
author: DS.belongsTo('author', { key: 'author_id' })
Run Code Online (Sandbox Code Playgroud)
然而,这不起作用; 该出版物中的作者仍为空.
我现在看到的唯一解决方案是实现自定义序列化程序并将author_id覆盖为author(通过normailzeId); 我无法改变我的后端数据结构...因此:
App.MySerializer = DS.RESTSerializer.extend({
//Custom serializer used for all models
normalizeId: …Run Code Online (Sandbox Code Playgroud) 我的服务器返回一个JSON响应,如下所示:
{
artists: [{
id: "1",
first_name: "Foo",
last_name: "Bar"
}],
studios: [{
id: 1,
name: "Test",
// ...
artist_ids: ["1"]
}]
}
Run Code Online (Sandbox Code Playgroud)
"艺术家"实际上是一个用户模型,但名称不同.如何将艺术家映射到用户模型?也许是一个糟糕的解释,但如果我将JSON响应服务器重命名为"用户"而不是"艺术家",并使用下面的模型,一切都像我想要的那样.我只想在服务器端和客户端使用名称"artist"而不是"user".希望你们明白我的意思.
App.Studio = DS.Model.extend
name: DS.attr 'string'
// ..
users: DS.hasMany 'App.User'
App.User = DS.Model.extend
firstName: DS.attr 'string'
lastName: DS.attr 'string'
studio: DS.belongsTo 'App.Studio'
Run Code Online (Sandbox Code Playgroud)
我想最简单的事情就是艺术家:DS.hasMany'App.User',但显然这不起作用.
我正在尝试规范化REST API中的数据.我不会改变JSON响应.
我如何通常使用此JSON响应来提取嵌入式记录,使其处于侧载格式.
服务器的响应如下所示:
{
"objects": [
{
"active": true,
"admin": true,
"created_at": "2013-11-21T15:12:37.894390",
"email": "me@example.com",
"first_name": "Joe",
"id": 1,
"last_name": "Joeson",
"projects": [
{
"created_at": "2013-11-21T15:13:13.150572",
"id": 1,
"name": "Super awesome project",
"updated_at": "2013-11-21T15:13:13.150606",
"user_id": 1
}
],
"updated_at": "2013-12-06T19:50:17.035881"
},
{
"active": true,
"admin": false,
"created_at": "2013-11-21T17:53:17.155700",
"email": "craig@example.com",
"first_name": "Craig",
"id": 2,
"last_name": "Craigson",
"projects": [
{
"created_at": "2013-11-21T17:54:05.527790",
"id": 2,
"name": "Craig's project",
"updated_at": "2013-11-21T17:54:05.527808",
"user_id": 2
},
{
"created_at": "2013-11-21T17:54:29.557801",
"id": 3,
"name": "Future …Run Code Online (Sandbox Code Playgroud) 我正在尝试Authorization在初始化和使用适配器后向我的适配器请求添加标头.我可以在创建my时以静态方式添加标题ApplicationAdapter,但我似乎无法在后续REST调用中使用标题.我在尝试这个:
var auth= "Basic " + hash;
App.ApplicationAdapter.reopen({
headers: {
Authorization: auth
}
});
Run Code Online (Sandbox Code Playgroud)
我已经RESTAdapter在ajax方法中进行了调试,并且测试adapter.headers始终是undefined.
我意识到有几个类似的问题,但这些答案似乎都没有解决我的问题.我的目标是获取一个列表language,并过滤它们,以便我的模板可以显示完整列表的子集.
我开始验证我的计算属性是否正常工作:
MyController.js
// Works as expected
languagesFiltered: function() {
return this.get('languages');
}.property('languages')
Run Code Online (Sandbox Code Playgroud)
然后我添加了一个过滤功能,但这里遇到了麻烦:
MyController.js
languagesFiltered: function() {
// console.log shows that languages is actually a promise
var languages = this.get('languages');
// all of this returns a promise, but Handlebars can't handle the promise
return languages.then( function( languagesArray ) {
return languagesArray.filter( function( item, index, enumerable) {
return item.get('name') !== 'English';
});
})
}.property('languages')
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用该Ember.Array.filter方法(http://emberjs.com/api/classes/Ember.ArrayProxy.html#method_filter).过滤器似乎工作正常,但现在languagesFiltered返回一个promise,Handlebars无法处理.
我尝试了最后一种选择:
MyController.js
languagesFiltered: function() {
var languages …Run Code Online (Sandbox Code Playgroud) 我有一个带有timestamp属性的模型.当在服务器上创建记录时,我希望服务器而不是提供值的客户端使用值初始化此属性的值,以便这些时间戳在不同客户端之间保持一致.
如果我直接使用firebase API,那么我理解我可以使用特殊令牌Firebase.ServerValue.TIMESTAMP来实现这一点.但我无法弄清楚如何使用ember-data和emberfire适配器来做到这一点.
我使用的灰烬CLI默认情况下它似乎设置Ember.MODEL_FACTORY_INJECTIONS = true;在app.js.
我尝试将此行注释掉(并将其设置为false)然后我的应用程序似乎表现出某种严格的模式.我得到了一堆失败的断言,因为我的一些模型关系没有明确指定逆.
这是确切的错误:
You defined the 'account' relationship on (subclass of DS.Model), but multiple possible inverse relationships of type (subclass of DS.Model) were found on (subclass of DS.Model). Look at http://emberjs.com/guides/models/defining-models/#toc_explicit-inverses for how to explicitly specify inverses
使用默认的Ember CLI生成的应用程序Ember.MODEL_FACTORY_INJECTIONS = true;,我没有收到这些错误.所以我会相信这个标志会以某种方式改变核心行为.
洞察力!
从EmberJS文档中,我得到以下两种方法来检索给定类型的所有记录,一个是发出请求而另一个不是.
var posts = this.store.findAll('post'); // => GET /posts
var posts = this.store.peekAll('post'); // => no network request
在我看来,我总是需要先做一个,findAll但我不明白我应该什么时候做peekAll.
例如,用户进入我的博客然后我得到所有的帖子使用findAll,然后在同一流程中的某些点我需要所有这些帖子,所以我应该使用a peekAll来节省带宽.所以我怎么知道我以前要求所有的posts?我应该保存一些全球状态来处理吗?我会假设第一次客户端请求a peekAll如果没有任何记录它会自动执行findAll或者我应该手动但它可能会引入一些样板.
如何在实践中运用findAll和peekAll或者等价物单记录?有什么建议?