backbone.js的哪个组件应该与服务器通信?

时间:2011-07-06 05:36:37

标签: javascript jquery backbone.js

我想用backbone.js做一个基本的CRUD应用程序。所以我想从服务器列出一些东西,创建和编辑它们。

这就是我理解这一点:

我的ModelCollection都包含网址。该集合将获取数据,模型将创建/保存()数据。

View处理所有交互,例如调用collection.fetch或model.save,然后在成功后将模型添加到集合中。

模型和集合上的url属性对我来说似乎是重复的代码。这是进行服务器交互的正确方法吗?

这就是我的结构参考:

window.User = Backbone.Model.extend({
    initialize: function () {
    },
    defaults:
       {
           Name: '',
           Age: 0,
           Items: []
       }
});

window.UserList = Backbone.Collection.extend({
    model: User,
    url: "/Users"
});


window.UserView = Backbone.View.extend({
    el: 'body',
    collection: new window.UserList,
    template: _.template($('#user-view-template').html()),
    events: { "submit form#newUser": "addItem" },
    initialize: function () {
        _.bindAll(this, 'render', 'update', 'addItem');
        this.collection.bind('refresh', this.render);
        this.collection.bind('change', this.render);
        this.update();
    },
    render: function () {
        $("#sup").html(this.template({ users: this.collection.toJSON() }));
        return this;
    },
    update: function () {
        this.collection.fetch();
    },
    addItem: function (e) {
        e.preventDefault();
        var person_attrs = $(e.target).serializeObject();
        this.collection.create(person_attrs, {
            success: function (saved_person, data) {
                if (data.Result == "Success") {
                    alert("success");
                }
                else {
                    alert(data.Message);
                }
            },
            error: function (aborted_person, response) {
                alert("Server Error");
            }
        });
        return false;
    }
});

window.View = new window.UserView;

2 个答案:

答案 0 :(得分:2)

为了灵活性,Model和Collection都有一个url。

默认情况下,模型将根据集合中定义的url及其id构建其url,但如果您需要替代行为或模型存在于集合之外,则可以覆盖此功能。

Backbone非常适合RESTful apis。 RESTful api中的示例资源可以是:

其中

  • GET - > / dog返回狗列表
  • POST - > / dog创造了一条新狗
  • GET - > / dog / 1返回id为1的狗
  • PUT - > / dog / 1使用新数据更新id为1的狗

Backbone中的相应内容可能是

  • DogCollection.url =“/ dog”
  • DogModel.url = collectionUrl + this.id?

所以如果你有一个新的模型对象fido = new DogModel({name:'fido'}) 你怎么保存它?

你有两个选择:

  1. 确保DogModel.url()被适当地覆盖,然后随时调用dog.save()
  2. 将模型附加到集合。因此,例如,如果您已经有一个集合dogsCollection,则可以使用其create方法。要么:dogsCollection.create(fido)或dogsCollection.create({name:'Fido'})或dogsCollection.create(新DogModel({name:'Fido'}) - 请随时

答案 1 :(得分:0)

您不需要模型上的url属性。就在收藏品上。如果您在集合上有一个网址

/foo

和带

的模型
id = 76

然后只要模型是集合的一部分,它就可以找出它自己的宁静网址

/foo/76

您只需要调用model.save。无需直接与服务器“通信”。 Backbone.js负责处理HTTP动词的选择以使用