BackboneJS模型/集合urlRoot / URL的意义

时间:2014-04-14 12:35:09

标签: javascript rest backbone.js model-view-controller javascriptmvc

让我们说我有一个Person模型/集合如下;

define([
    'base/BaseModel'
], function(BaseModel) {
    var Person = BaseModel.extend({
        idAttribute: "personId",
        urlRoot: "manapp/person/",
        defaults: {
            "personId": null
        }
    return Person;
});

define([
    'base/BaseCollection',
    'model/Person'
], function(BaseCollection, Person) {
    var PersonCollection = BaseCollection.extend({
        url: "manapp/person",
        model: Person
    });
    return PersonCollection;
});

如您所见,我在模型/集合中有一个urlRoot / url属性。

我的问题是为这个属性指定值的确切含义是什么?它仅适用于相应的REST资源吗?如果是,那是否只适用于GET操作?此外,您何时才能使用模型和集合?

2 个答案:

答案 0 :(得分:1)

urlRoot和url定义请求发送到的服务器路径。

编辑:来自Backbone文档:

url:

  

返回模型资源所在的相对URL   在服务器上。如果您的模型位于其他位置,请覆盖   这种方法具有正确的逻辑。

urlRoot:

  

如果您正在使用集合之外的模型,请指定urlRoot   启用默认网址功能以根据模型生成网址   ID。 “[urlRoot] / id”通常,您无需定义此内容。

当您使用实现REST API的Laravel等后端MVC框架时,您可以在路由器中定义路径并从控制器对象处理对此路径的请求。
我会用Laravel作为插图,因为这清楚了。

例如,定义时:

urlRoot: "/api_v1/entities/parents"

Laravel实现了“资源丰富”的控制器,可以处理发送到服务器上特定urlRoot的不同REST调用:

Route::resource('entities/parents', 'ParentsController');

'ParentsController'实现处理可能发生的不同REST调用的方法集。

'GET'不是您可以使用的唯一HTTP动词,而且还是'POST','PUT'或'DELETE'。

在Backbone中: 对于'GET',你在对象上调用'fetch()' 对于'POST',你在对象上调用'save()' 对于'DELETE',你在对象上调用'destroy()' 对于'PUT',您可以在对象上调用'save()',但在获取的模型更新后。例如:

    var parent_model = new Parent_model({'id': 1}); 
    parent_model.fetch(); 
    parent_model.set('parent_name', 'some_parent'); 
    parent_model.save(); 

在上面的例子中,'PUT'请求被发送到以下路径:

/api_v1/entities/parents/1

控制器实现了一个处理服务器上REST调用的函数,如下所示:

public function update($id){ //Update code db here }; 

除了这些标准的REST调用之外,Laravel还实现了一个'index'方法,该方法不将id作为参数,并处理一般的'GET'请求。
我倾向于使用它从服务器获取集合:
例如,父项的index()方法将返回所有父项,并且不适用于一个特定的父项记录。

希望它有所帮助。

答案 1 :(得分:1)

Kim Gysen的回答主要集中在服务器端;我想您可能会询问urlurlRoot之间的客户端差异,以及它们如何对模型与集合进行操作。

指定Model.urlRoot以覆盖集合的默认网址。 Backbone docs很好地解释了它,但基本上,Backbone将调用以在模型上运行的URL默认构造为:

  • [collection.url]/[collection.id]/[model.url]/[model.id]

对于属于父母"集合,如:

  • /documents/8/notes/2

现在,如果您使用的是#34; standalone"而不是集合的一部分,您指定Model.urlRoot,以便URL构造为:

  • [model.urlRoot]/[model.id]

很有可能,您只需要指定一个Collection.url。如果您未在模型上指定urlurlRoot,并且指定了manapp/person的集合网址,则Backbone将从以下位置检索您的集合:

  • GET /manapp/person,并期待Person个模型列表

然后在单个模型上进行操作

  • 创建POST /manapp/person/:id;数据有效负载是新person记录
  • 的JSON
  • 阅读GET /manapp/person/:id
  • 更新PUT /manapp/person/:id; data payload是更新的person记录的JSON(包括非脏属性!)
  • 删除DELETE /manapp/person/:id