2011-07-06 20 views
1

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

这是我的理解这一点:

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

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

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

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

Backbone与RESTful API非常相配。 以RESTful API的一个例子资源可以是:

其中

  • GET - > /狗返回犬的名单
  • POST - > /狗创建一个新的狗
  • GET - >/dog/1返回ID为1的狗
  • PUT - >/dog/1用新数据更新ID为1的狗

在骨架中的对应可以是

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

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

你有2种选择:

  1. 确保DogModel.url()是在恰当地写入,然后随时拨打dog.save()
  2. 附上模式的集合。例如,如果你已经有一个集合dogsCollection,你可以使用它的create方法。或者:dogsCollection.create(fido)或dogsCollection.create({name:'Fido'})或dogsCollection.create(新DogModel({name:'Fido'}) - 请按照您的要求
+0

您能告诉我您是如何将模型分配给您的集合的,因此当您创建新模型时,它知道集合的URL ?我会发布我的代码。 –

+0

嘿@Lol编码器,我在最后扩展了答案。希望对你有帮助! – 34m0

0

你并不需要在模型url属性。只是在收集。如果您对集合的URL作为

/foo 

,并用

id = 76 

那么只要该模型是集它可以计算出它自己的宁静网址为

的一部分的模型
/foo/76 

你只需要调用model.save。没有必要直接与服务器“沟通”。 Backbone.js负责处理使用HTTP动词的选项

+0

我将如何创建一个新的模型?我使用'this.collection.create()'。但是如果我使用'var user = new User()'然后'user.save()',它会请求一个url。 –

+0

首先将它添加到然后保存它,或者使用集合上的create方法一步完成此操作 – bradgonesurfing

相关问题