Ember将空行添加到数据中,并将slug作为id

时间:2013-11-01 12:59:32

标签: ajax ember.js ember-data

我有一个资源,我从服务器/项目列出我的所有项目。您可以访问转到/ 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: ------------------------------- 

3 个答案:

答案 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数据。

希望它有所帮助。

相关问题