我有一个资源,我从服务器/项目列出我的所有项目。您可以访问转到/ projects /:slug的具体项目。
当我访问项目资源时,我在Ember Inspector中看到了这些数据:
/项目
id | Slug | Title |
-------------------------------------------------
1 | first-project | First project |
-------------------------------------------------
2 | second-project | Second project |
-------------------------------------------------
3 | third-project | Third project |
当我从项目列表中访问项目时,我得到相同的数据而没有新的ajax请求,一切正常。的 /项目/先项目
当我刷新 / projects / first-project 页面时出现问题。 Ember发出了一个从服务器获取数据的ajax请求,但它也插入了一个空行,其中slug作为数据的id。
id | Slug | Title |
-------------------------------------------------------------
first-project | | |
-------------------------------------------------------------
1 | first-project | First project |
现在访问项目列表它显示了一个项目列表,但在列表顶部是这一空行。为什么要将这个slug行插入我的数据?也许我的逻辑错了。
<li>
<a id="ember451" class="ember-view" href="/projects/undefined">
<script id="metamorph-13-start" type="text/x-placeholder"></script>
<script id="metamorph-13-end" type="text/x-placeholder"></script>
</a>
</li>
我的项目代码:
App.Router.map(function() {
this.resource('project', { path: '/projects' }, function() {
this.resource('project.show', { path: ":post_slug"});
});
});
App.Project = DS.Model.extend({
slug: DS.attr("string"),
title: DS.attr("string")
});
App.ProjectIndexRoute = Ember.Route.extend({
model: function() {
return this.store.find('project').then(function(data) {
return data;
});
}
});
App.ProjectShowRoute = Ember.Route.extend({
model: function(params) {
return this.store.find('project', params.post_slug).then(function(data) {
return data;
});
},
serialize: function(model) {
return { post_slug: model.get("slug") };
}
});
我正在使用:
DEBUG: -------------------------------
DEBUG: Ember : 1.1.2
DEBUG: Ember Data : 1.0.0-beta.3
DEBUG: Handlebars : 1.0.0
DEBUG: jQuery : 1.9.1
DEBUG: -------------------------------
答案 0 :(得分:2)
添加此功能有帮助。现在主键是Project模型的slug,它不会重复行。
App.ProjectSerializer = DS.RESTSerializer.extend({
normalize: function(type, hash, property) {
hash.id = hash.slug;
return this._super(type, hash, property);
}
});
答案 1 :(得分:0)
致电
store.find('project', 'first-project')
你把slu is视为主键。我想这就是新记录被初始化的原因(你有一个用第一个项目的实际主键,可能是一个数字,一个用'first-project'作为主键。 尝试通过使用搜索选项的散列调用商店的find()方法来更改模型挂钩,在您的情况下:
store.find('project', { slug: 'first-project' })
答案 2 :(得分:0)
如果不扩展RESTSerializer,还有另外两种方法可以解决这个问题。
第一种方法 :如果您可以确保slug str在整个应用中是唯一的,并且您并不真正关心ID号。然后你可以使用slug str为每个项目设置id,因为id不一定是数字。
{id:'first-project',内容:'xxx'} {id:'second-project',内容:'yyy'}
第二种方法 。使用modelFor方法。示例代码如下:
App.ProjectShowRoute = Ember.Route.extend({
model: function(params) {
return this.modelFor('its_parent_route').findBy('slug', params.post_slug);
},
serialize: function(model) {
return { post_slug: model.get("slug") };
}
});
通过调用modelFor,它不会对服务器进行重复调用,因为你正在使用ember数据。
希望它有所帮助。