我正在使用带有rails和MongoDB的ember-data,并且对于在MongoDB中存储ID的方式存在问题 - 在_id字段中.
Ember-data将使用id作为ID的默认字段,所以我试图像这样覆盖它:
App.User = DS.Model.extend
primaryKey: "_id"
name: DS.attr "string"
image: DS.attr "string"
Run Code Online (Sandbox Code Playgroud)
这似乎在大部分时间都有效,但在某些情况下,我从ember说得到例外:
未捕获错误:断言失败:您的服务器返回带有密钥_id的哈希,但您没有映射
我怀疑这可能是ember-data中的一个错误,因为它仍处于开发阶段,但是我试图找到一种方法来将_id映射到服务器端的id中?我正在使用mongoid来进行mongo映射.
我试图在其他参数上进行查找(使用余烬数据)而不是id,实际上是两个参数.
但我回来的是:
"Uncaught Error: assertion failed: Your server returned a hash with the key customer but you have no mappings".
Run Code Online (Sandbox Code Playgroud)
在代码中挖掘之后,我看到find方法在给定哈希时委托给findQuery方法,这会创建一个DS.AdapterPopulatedRecordArray,但我只在我的json中返回一个客户对象:
{"customer":{
"id":24857,"name":"Kim Fransman","id_number":"XXXX","email":"email@domain.com","type":"Person"}}
Run Code Online (Sandbox Code Playgroud)
我可以通过将json包装在customers数组中并在我的Handlebars视图中循环遍历来解决这个问题,但这感觉非常错误.
今天有没有办法用ember-data做到这一点?
我们的应用程序使用FixtureAdapter的ember-data.我们正在使用Jasmine和js-test-driver测试模型代码(各种JS计算).每个块都在beforeEach块中创建自己的记录集.
这适用于2013-03-05(rev 7575f5a)本地构建的ember-1.0.0-rc.1和ember-data.我目前正在尝试升级到1.0.0-rc.3和最新的余烬数据,但我遇到了一个具有独特ID的障碍.运行所有测试时出现以下错误:
Error: assertion failed: The id 1001 has already been used with another record of type .Foo. in http://localhost:56390/js/lib/ember-1.0.0-rc.3.js (line 52)
Run Code Online (Sandbox Code Playgroud)
它看起来像是一个较新版本的独特ID上的ember-data断言.不幸的是,我们的测试需要硬编码的id用于在每个测试的beforeEach块中重新创建的记录.所以每个测试都创建一个ID为1001的Foo.
是否有一种简单的方法可以使用FixtureAdapter重置所有数据(因此忘记Foo 1001)?我尝试用以下方法重置灯具:
App.Foo.FIXTURES = []
Run Code Online (Sandbox Code Playgroud)
然而,ember-data似乎仍然在某处跟踪旧记录.我也尝试过App.reset(),但它似乎没有重置商店.
我们也这样做
App.Store = DS.Store.extend({
revision: 12,
adapter: 'DS.FixtureAdapter'
});
Run Code Online (Sandbox Code Playgroud)
在beforeEach块中假设通过创建新商店来清除所有数据,但这也不起作用.
我需要以特定方式配置Jackson,我将在下面介绍.
idid"_id"后缀添加到属性名称"_ids"后缀添加到属性名称@JsonId,最好有一个可选的值来覆盖名字就像@JsonProperty做@JsonIdentityInfoid属性可发现性的注释(例如,对JPA场景有用)考虑到这些POJO:
//Inform Jackson which property is the id
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id"
)
public abstract class BaseResource{
protected Long id;
//getters and setters
}
public class Resource extends BaseResource{
private String name;
@JsonId
private SubResource subResource;
@JsonId
private List<SubResource> subResources;
//getters and setters
}
public class …Run Code Online (Sandbox Code Playgroud) 我有一个模范老师,有很多学生.模型定义如下:
App.Teacher = DS.Model.extend({
email: DS.attr('string'),
students: DS.hasMany('student')
});
App.Student = DS.Model.extend({
teacher: DS.belongsTo('teacher'),
});
Run Code Online (Sandbox Code Playgroud)
当教师登录时,服务器返回教师的JSON表示:
{
id: 1,
email: "abc@example.com",
links: {
students: /teacher/1/students
}
}
Run Code Online (Sandbox Code Playgroud)
在登录控制器中,然后我将这些数据推送到商店并将其存储在Session控制器的属性中:
this.set('currentUser', this.get('store').push('teacher', teacherJson))
Run Code Online (Sandbox Code Playgroud)
我想延迟加载students关联,所以我使用了API中定义的"链接"格式(http://emberjs.com/api/data/classes/DS.Store.html#method_push).所以,理想情况下,每当我打电话
App.SessionController.get('currentUser').get('students')
Run Code Online (Sandbox Code Playgroud)
它会students通过发送GET请求来加载关联的/teacher/1/students.但这从未发生过.为什么没有触发请求?
我正在使用带有rails后端的RESTful适配器的Ember Data.
当我从灰烬中删除记录record.deleteRecord(); record.save()的DELETE请求转到服务器和模型将被删除,但这个错误打印到JavaScript控制台:
Extract requested, but no data given for App.ThisModel. This may cause weird problems.
Run Code Online (Sandbox Code Playgroud)
来自服务器的响应是render json: true,所以我将其更改为render json: deleted_model渲染已删除记录的json.
这摆脱了以前的错误,但现在删除的记录在Ember中重新创建.
Ember在回复中期望什么?
我正在使用ember-cli设置一个基本应用程序,并且使用带有ember-data的api-stub遇到了麻烦.我引用了api-stub README并引用了ember指南,但无法弄清楚我缺少什么.我有点像菜鸟,所以请原谅我的任何明显的疏忽.
这是我的设置......
/api-stub/routes.js
server.get('/listings', function(req, res) {
var listing = {
"listing": [{
"id": 1,
"title": "Sunny 1-bedroom",
"unit_type": "1br / 1ba",
"description": "Roomy 1-bedroom apartment in pre-war walkup. Gets great morning light from the south."
},
{
"id": 2,
"title": "Large 2-bedroom",
"unit_type": "2br / 1.5ba",
"description": "Roomy 2-bedroom apartment in pre-war walkup. Gets great morning light from the south."
}]
};
res.send(listing);
});
Run Code Online (Sandbox Code Playgroud)
/app/adapters/application.js
var ApplicationAdapter = DS.RESTAdapter.extend({
namespace: 'api'
});
export default ApplicationAdapter;
Run Code Online (Sandbox Code Playgroud)
/package.json
{
... …Run Code Online (Sandbox Code Playgroud) 在Ember文档中,我发现find()支持通过id查找:
this.store.find('post', 1); // => GET /posts/1
Run Code Online (Sandbox Code Playgroud)
并且还通过传递任意参数:
this.store.find('post', { name: "Peter" }); // => GET to /posts?name='Peter'
Run Code Online (Sandbox Code Playgroud)
但在我的情况下,我必须通过id找到,并传递一个额外的参数来请求所有字段包含在响应中(默认情况下会省略一些),如下所示:
this.store.find('post', 1); // => GET /posts/1?include=all
Run Code Online (Sandbox Code Playgroud)
我试着这样做:
this.get('store').find('post', params.post_id, { include : 'all' });
Run Code Online (Sandbox Code Playgroud)
但我的参数被忽略了.
这似乎是一个相当基本的用例,所以我必须遗漏一些东西......
我怎么能做到这一点?
做ember -v只显示ember cli版本.
如何查看ember.js版本和ember数据版本?
我有以下型号:
#order/model.coffee
Order = DS.Model.extend {
line_items: DS.hasMany 'product', {async: true}
}
Run Code Online (Sandbox Code Playgroud)
在某些时候,我想将一些产品添加到订单中.我发现我只能添加一次产品,再添加相同的产品不起作用:
#product/route.coffee
...
actions:
# Not actually my code but illustrates the problem
addToCart: (product1, product2)->
order = @modelFor 'order'
console.log order.get('line_items.length') # prints 0
order.get('line_items').pushObject product1
console.log order.get('line_items.length') # prints 1
order.get('line_items').pushObject product2
console.log order.get('line_items.length') # prints 2
order.get('line_items').pushObject product1
console.log order.get('line_items.length') # prints 2
order.get('line_items').pushObject product2
console.log order.get('line_items.length') # prints 2
...
Run Code Online (Sandbox Code Playgroud)
问题是用户可能不止一次需要单个项目.表示该方法的最简单方法是使数组具有重复条目.看来Ember并没有让我为关系这样做.如何在关系中多次添加模型?
ember-data ×10
ember.js ×10
javascript ×2
ember-cli ×1
jackson ×1
java ×1
json ×1
mongodb ×1
mongoid ×1