使用MongoDB ObjectID进行主干同步/保存

时间:2015-01-15 02:07:49

标签: node.js mongodb backbone.js

我不了解Backbone的一个方面是它如何知道数据库中的哪些对象要同步。我在后端使用MongoDB - 如何告诉Backbone生成MongoDB样式的ObjectID以存储在DB中(也许Backbone只从Mongo获取ID - 但如果不是,我如何保证这个Backbone生成的ID与MongoDB生成ObjectIDs?)我遇到的主要问题是没有Backbone.Model id附加到我在PUT或DELETE调用模型中定义的根URL的末尾。

这是我的模特:

var team = document.getElementsByName('team');
console.log(team);

var Player = Backbone.Model.extend({
    defaults: {
        ID: "",
        team: team,
        firstName: '',
        lastName: '',
        age: '',
        phone: '',
        email: ''
    },
    idAttribute: "ID",
    urlRoot: 'http://localhost:3000/api/players'
});

var PlayerCollection = Backbone.Collection.extend({
    model: Player
});

这是视图:

var addPlayerView = Backbone.View.extend({
    tagName: "div",
    id: 'addPlayerDiv',
    events: {
        'click #submitNewPlayer': 'onAddPlayer',
        'click #cancelNewPlayer': 'cancelAddPlayer'
    },
    initialize: function () {

    },
    render: function () {
        var playerTemplate = document.getElementById('add-player-template').innerHTML;
        this.$el.html(_.template(playerTemplate)());
        return this;
    },
    onAddPlayer: function (event) {
        event.preventDefault();
        var data = form2js('add-player-template-form','.',true);
        this.model.set({id:data.age,age:data.age,phone:data.phone,email:data.email});
        this.model.save();
        $(this.el).removeData();
        this.unbind();
        this.remove();
        window.mainManageRosterView.render();
    }

});

这里是我使用新模型实例初始化新视图的地方:

<script>

    function addNewPlayer(event) {
        event.preventDefault();
        var player = new Player({}); //perhaps this is incorrect, the id is null/undefined after all
        var newPlayerView = new addPlayerView({el: $("#addPlayerDiv"), model: player});
        var rendered = newPlayerView.render();
        $(rendered.el).appendTo(this.$el).hide().fadeIn().slideDown();
    };

</script>

当然我做错了什么。该模型在视图中绝对不是未定义的,但它没有ID。如何为我的Backbone模型提供ID?也许Backbone只在保存后才给模型一个id?

重申一下,我遇到的主要问题是Backbone不会自动将ID附加到我在模型中定义的根URL的末尾:

PUT /api/players/ 404 319ms - 475b

但它看起来应该是这样的:

PUT /api/players/[mongoDB ObjectID here] 200 319ms - 475b

所以基本上,ID丢失了,我不知道为什么。此外,为什么Backbone在做PUT呢?如果它是第一次保存此模型,那么它不应该是POST吗?

1 个答案:

答案 0 :(得分:1)

是否有可能,ID未定义,因为您只是定义了id

您正在使用this.model.set({id:data.age, ...小写)来定义您的标识符 但是将idAttribute: "ID",大写)定义为ID属性。

相关问题