【问题标题】:BackboneJS Significance of Model/Collection urlRoot/URL模型/集合 urlRoot/URL 的 BackboneJS 意义
【发布时间】:2014-04-14 12:35:08
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    编辑:来自 Backbone 文档:

    网址:

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

    urlRoot:

    如果您使用集合之外的模型,请指定 urlRoot,以 开启默认url函数,根据模型生成url ID。 "[urlRoot]/id" 通常不需要定义这个。

    当您使用实现 REST api 的后端 MVC 框架(例如 Laravel)时,您可以在路由器中定义路径并处理从控制器对象到此路径的请求。
    我将使用 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 还实现了一个“索引”方法,它不以 id 作为参数,并处理一个通用的“GET”请求。
    我倾向于使用它从服务器获取集合:
    例如,父母的 index() 方法将返回所有父母,并且不适用于特定的父母记录。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

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

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

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

      这对于属于“父”集合的模型尤其有效,例如:

      • /documents/8/notes/2

      现在,如果您在“独立”而不是集合的一部分的模型上进行操作,则指定 Model.urlRoot,以便 URL 构造为:

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

      您很可能只需要指定一个 Collection.url。如果您没有在模型上指定 urlurlRoot,并且指定集合 url 为 manapp/person,那么 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-09
        • 1970-01-01
        • 1970-01-01
        • 2020-01-03
        • 1970-01-01
        • 1970-01-01
        • 2011-11-28
        • 2013-07-27
        相关资源
        最近更新 更多