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

BackboneJS Significance of Model/Collection urlRoot/URL

本文关键字:URL urlRoot 模型 集合 BackboneJS      更新时间:2023-09-26

假设我有一个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操作?此外,您究竟什么时候为他们使用模型和集合?

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

编辑:从主干文档:

网址:

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

urlRoot:

如果您在集合之外使用模型,请指定urlRoot,以启用默认url函数以基于模型生成urlid。"[urlRoot]/id"通常,您不需要定义它。

当您使用实现RESTapi的后端MVC框架(如Laravel)时,您可以在路由器中定义路径,并处理从控制器对象到该路径的请求
我会用拉拉威尔作为例子,因为这很清楚。

当你定义例如:

urlRoot: "/api_v1/entities/parents"

Laravel实现了"足智多谋"的控制器,可以处理发送到服务器上特定urlRoot的不同REST调用:

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

其中"ParentsController"实现了一组方法,用于处理可能发生的不同REST调用。

"GET"不是唯一可以使用的HTTP谓词,还可以使用"POST"、"PUT"或"DELETE"。

在主干网中:对于"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()方法将返回所有父母,并且不适用于一个特定的父母记录。

希望能有所帮助。

Kim Gysen的答案集中在服务器端;我想您可能会询问urlurlRoot之间的客户端差异,以及它们在模型与集合上的操作方式。

您可以指定一个Model.urlRoot来覆盖集合的默认url。Backbone文档对其进行了很好的解释,但基本上,Backbone将调用以对您的模型进行操作的URL默认构造为:

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

这对于作为"父"集合一部分的模型尤其有效,例如:

  • /documents/8/notes/2

现在,如果您操作的模型是"独立的",而不是集合的一部分,那么您可以指定一个Model.urlRoot,这样URL就被构造为:

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

很可能,您只需要指定Collection.url。如果您没有在模型上指定urlurlRoot,而是指定了manapp/person的集合url,那么Backbone将从以下位置检索您的集合:

  • GET /manapp/person,并且期望Person模型的列表

在单个模型上操作将是

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