有没有人想出多态关联和余烬数据的答案?
我们需要一些能够从我所知道的方式查询关系另一端的类型的方法.
有人对此有何看法?
Ember数据仍未达到版本1.0,因此我决定使用Ember而不使用Data模型.
我有自己的模型,这些模型由路径模型函数创建.
但是,保持前端对象和后端对象之间的状态是一场噩梦.特别是当一条路线使用其他路线模型时.
我正在做最好的做法,还是我应该采取不同的做法?我的直觉是,如果不使用Ember Data,我应该写自己的商店.我很乐意收到你们中的一些人的反馈.
模型示例:
App.Person = Ember.Object.extend(App.Serializable,Em.Copyable,{
user_email : null //used in routing dynamic segements and as old email when making changes to email
,first_name: null
, last_name: null
, fullname : function () {
return this.first_name + ' ' + this.last_name;
}.property('first_name','last_name').cacheable()
};
App.Person.reopenClass({
createRecord: function(data) {
return App.Person.create({
user_email : data.email
, first_name: data.first_name
, last_name : data.last_name
}});
Run Code Online (Sandbox Code Playgroud)
我如何加载类模型的示例:
App.UsersRoute = App.AuthenticatedRoute.extend( {
model : function () { …Run Code Online (Sandbox Code Playgroud) 我试图用Ember和Ember Data做一些非常基本的事情.
1)帖子属于用户; 用户有很多帖子
2)在创建新的Post表单中,我想要选择/下拉所有用户
3)当我编辑帖子(使用相同的表单)时,我想将其正确绑定回dropbox
问题:执行与用户列表绑定的下拉列表的最佳做法是什么?如何绑定编辑表单以再次填充下拉列表?
用户模型:
App.User = DS.Model.extend({
posts: DS.hasMany('post', {async: true}),
});
Run Code Online (Sandbox Code Playgroud)
邮政模式:
App.Post = DS.Model.extend(Ember.Validations.Mixin, {
user: DS.belongsTo('user', {async: true}),
});
Run Code Online (Sandbox Code Playgroud)
创建新的职位表格:
{{view Em.Select
content=users <<<<< How do I bind this.store.find("user") here?
optionValuePath='content.id'
optionLabelPath='content.name'
}}
Run Code Online (Sandbox Code Playgroud)
我不明白将选择内容与用户绑定的最佳做法.
尝试1:
*我使用的是Ember-Form
{{em-select
property="user_id"
label="user"
prompt="Select user:"
content=controllers.users.content
optionValuePath="content.id"
optionLabelPath="content.first_name"
}}
Run Code Online (Sandbox Code Playgroud)
在保存操作上:
newItem.set('user', this.store.getById('user', this.get('user_id')));
Run Code Online (Sandbox Code Playgroud)
我尝试使用user_id作为表单的属性,并在保存时转换回用户对象以分配给帖子.但是,这种方法有点愚蠢,因为我每次保存时都会主动将user_id转换为用户对象.我觉得应该有一种方法可以自动完成,如果我做了正确的绑定,而不是跳过箍来绑定属性user_id.当我使用相同的表单编辑帖子时,这也使我很难绑定回来.由于已经建立了所有的关系,我觉得我在这里做错了.我认为必须有更好的方法.
谢谢!
我试图让我的余烬模型使用远程rails api.我试过扩展DS.RESTAdapter,但我不知道如何告诉模型使用这些设置.我的模型永远不会到达localhost:3000.
//app.js
import Ember from 'ember';
import Resolver from 'ember/resolver';
import loadInitializers from 'ember/load-initializers';
Ember.MODEL_FACTORY_INJECTIONS = true;
var App = Ember.Application.extend({
modulePrefix: 'friend-ember-app', // TODO: loaded via config
Resolver: Resolver
});
App.ApplicationAdapter = DS.RESTAdapter.extend({
host: 'localhost:3000',
namespace: 'api/v1'
});
loadInitializers(App, 'friend-ember-app');
export default App;
Run Code Online (Sandbox Code Playgroud)
//
//models/event.js
import DS from 'ember-data';
export default DS.Model.extend({
title: DS.attr('string'),
description: DS.attr('string')
});
Run Code Online (Sandbox Code Playgroud)
//
// controllers/index.js
import Ember from 'ember';
export default Ember.Controller.extend({
columns: function(){
//Attempting to see request to remote api
var events …Run Code Online (Sandbox Code Playgroud) 假设我有以下ember-data模型:
App.Person = DS.Model.extend({
firstName: DS.attr('string'),
lastName: DS.attr('string'),
starred: DS.attr('boolean')
});
Run Code Online (Sandbox Code Playgroud)
这与使用以下非常标准的CRUD API的Rails应用程序通信:
GET /people - get a list of people
POST /people - create a new person
GET /people/id - get a specific person
PUT /people/id - update a specific person
DELETE /people/id - delete a specific person
Run Code Online (Sandbox Code Playgroud)
这些都使用标准存储/适配器映射到Ember-Data.
但是,让我们说,为了让一个人"明星化"或"解除明星化",API不允许我们通过标准更新操作来执行此操作.此操作有一个特定的API端点:
POST /people/id/star - mark a person as "starred"
POST /people/id/unstar - mark a person as "unstarred"
Run Code Online (Sandbox Code Playgroud)
如何在Ember Data中使用此API?
看起来我需要以某种方式扩展DS.Store和DS.RESTAdapter,但我不确定让他们了解这些不同操作的最佳方法.对于应用程序的通用适配器必须知道主演人员,也感觉有点不对劲.
请注意,我无法控制API,因此我无法POST /people/id了解"主演",因此它适合标准更新.
我有两个这样的关系的余烬模型
App.Foo = DS.Model.extend
bar: DS.belongsTo("App.Bar", embedded: true)
App.Bar = DS.Model.extend
primaryKey: "blah"
blah: DS.attr "string
Run Code Online (Sandbox Code Playgroud)
如果我创建并保存这样的新记录:
foo = App.store.createRecord App.Foo
foo.set "bar", App.Bar.createRecord(blah: "blahblah")
App.store.commit()
Run Code Online (Sandbox Code Playgroud)
我看到2个帖子请求到服务器:
URL: /foos
Payload: {"foo":{"bar":null}}
Run Code Online (Sandbox Code Playgroud)
和
URL: /bars
Payload: {"bar":{"blah":"blahblah"}}
Run Code Online (Sandbox Code Playgroud)
该关联是嵌入式的,所以我希望看到:
URL: /foos
Payload: {"foo":{"bar":{"blah":"blahblah"}}}
Run Code Online (Sandbox Code Playgroud)
我可以使用ember-data REST适配器实现这一点,还是需要编写自己的代码来执行此操作?
任何人对如何实现同时使用localStorage和REST远程存储的数据持久层有任何想法或参考:
某个客户端的数据与localStorage一起存储(使用ember-data indexedDB适配器).本地存储的数据与远程服务器同步(使用ember-data RESTadapter).
服务器从客户端收集所有数据.使用数学集符号:
Server = Client1 ? Client2 ? ... ? ClientN
Run Code Online (Sandbox Code Playgroud)
通常,任何记录对某个客户来说可能不是唯一的:
ClientX ? ClientY ? 0, ? X,Y ? [1,N]
Run Code Online (Sandbox Code Playgroud)
以下是一些场景:
客户创建记录.无法在客户端上设置记录的ID,因为它可能与存储在服务器上的记录冲突.因此,需要将新创建的记录提交到服务器 - >接收id - >在localStorage中创建记录.
记录在服务器上更新,因此localStorage和服务器中的数据不同步.只有服务器知道,所以架构需要实现推送架构(?)
您是否会使用2个存储(一个用于localStorage,一个用于REST)并在它们之间同步,或者使用混合索引的DB2/REST适配器并在适配器中写入同步代码?
你能看到任何避免实现推送的方法(Web Sockets,...)?
Ember Objects和Ember Data之间有什么区别?我知道当服务器上有一些数据时我应该使用Ember Data模型,但是我应该在何时何地使用它们?
让我们说
Post = DS.Model.extend({
comments: DS.hasMany({async: true})
})
Comment = DS.Model.extend({
post: DS.belongsTo()
})
Run Code Online (Sandbox Code Playgroud)
并且我必须使用该links功能,否则由于对帖子的评论过多而导致414错误.
自此提交https://github.com/emberjs/data/commit/4d717bff53f8c93bedbe74e7965a4f439882e259
似乎不可能触发post.get('comments')的重新加载,即发送GET请求,例如post/42/comments.
那有什么解决方案吗?
我需要一次性将一个深层对象保存到服务器,并且无法在线找到任何使用最新ember数据(1.0.0-beta.4)的示例.
例如,使用这些模型:(jsfiddle)
App.Child = DS.Model.extend({
name: DS.attr('string'),
age: DS.attr('number'),
toys: DS.hasMany('toy', {async:true, embedded:'always'}),
});
App.Toy = DS.Model.extend({
name: DS.attr('string'),
child: DS.belongsTo('child')
});
Run Code Online (Sandbox Code Playgroud)
这段代码:
actions: {
save: function(){
var store = this.get('store'),
child, toy;
child = store.createRecord('child', {
name: 'Herbert'
});
toy = store.createRecord('toy', {
name: 'Kazoo'
});
child.set('toys', [toy]);
child.save();
}
}
Run Code Online (Sandbox Code Playgroud)
它只保存子对象的JSON,但不保存任何玩具 - 甚至没有侧载:
{
child: {
age: null
name: "Herbert"
}
}
Run Code Online (Sandbox Code Playgroud)
我是否还必须手动保存玩具?无论如何,我可以让它将以下JSON发送到服务器:
{
child: {
age: null
name: "Herbert",
toys: [{
name: "Kazoo"
}]
} …Run Code Online (Sandbox Code Playgroud)