当前位置: 首页 > 面试题库 >

多个Model子类的Backbone.js集合

连正信
2023-03-14
问题内容

我有一个REST Json API,它返回一个列表“
logbooks”。有许多实现不同但相似行为的日志。在数据库层的服务器端实现是一种单表继承,因此日志的每个JSON表示都包含其“类型”:

[
  {"type": "ULM", "name": "My uml logbook", ... , specific_uml_logbook_attr: ...},
  {"type": "Plane", "name": "My plane logbook", ... , specific_plane_logbook_attr: ...}
]

我想在客户端复制此服务器模型,所以我有一个基Logbook类和多个日志子类:

class Logbook extends Backbone.Model

class UmlLogbook extends Logbook

class PlaneLogbook extends Logbook

...

我的Backbone.Collection是一组Logbook用于查询JSON API的模型:

class LogbookCollection extends Backbone.Collection
  model: Logbook
  url: "/api/logbooks"

当我获取日志集合时,是否有一种方法可以将每个对象Logbook转换为其对应的子类(基于JSON“ type”属性)?


问题答案:

确实有。

当您在集合上调用“提取”时,它将响应通过Backbone.Collection.parse传递,然后再将其添加到集合中。

默认的’parse’实现只是按原样传递响应,但是您可以覆盖它以返回要添加到集合中的模型列表:

class Logbooks extends Backbone.Collection

  model: Logbook

  url: 'api/logbooks'

  parse: (resp, xhr) ->
    _(resp).map (attrs) ->
      switch attrs.type
        when 'UML' then new UmlLogbook attrs
        when 'Plane' then new PLaneLogbook attrs

编辑:哇,伊德本特利在我之前到达那儿。唯一的区别是他使用了“每个”,而我使用了“地图”。两者都可以工作,但是有所不同。

使用’each’有效地打破了’fetch’调用开始的链(通过返回’undefined’-随后对’reset’(或’add’)的调用将无济于事)并在解析中在那里进行所有处理功能。

使用“地图”只是将属性列表转换为模型列表,然后将其传递回已经运行的链中。

不同的笔画。

再次编辑:刚刚意识到还有另一种方法:

集合中的’model’属性仅存在,因此,如果集合在’add’,’create’或’reset’中传递了属性,则该集合知道如何制作新模型。因此,您可以执行以下操作:

class Logbooks extends Backbone.Collection

  model: (attrs, options) ->
    switch attrs.type
      when 'UML' then new UmlLogbook attrs, options
      when 'Plane' then new PLaneLogbook attrs, options
      # should probably add an 'else' here so there's a default if,
      # say, no attrs are provided to a Logbooks.create call

  url: 'api/logbooks'

这样做的好处是,该集合现在将知道如何为“获取”以外的操作“广播” Logbook的正确子类。



 类似资料:
  • 上一章主要是通过简单的代码对Backbonejs做了一个概括的展示,这一章开始从Model层说起,详细解释Backbonejs中的Model这个东西。 对于Model这一部分,其官网是这么说的:"Model是js应用的核心,包括基础的数据以及围绕着这些数据的逻辑:数据转换、验证、属性计算和访问控制"。这句话基本上高度概括了Model在一个项目中的作用。实际上,不仅仅是js应用,在任何以数据收集和处

  • 本文向大家介绍Backbone.js中的集合详解,包括了Backbone.js中的集合详解的使用技巧和注意事项,需要的朋友参考一下 Backbone.js的集合只是一个简单的有序集的模型。通过适应模型和集合,我们可以避免数据处理逻辑放到了我们的视图层。此外,模型和集合还提供了便利的与后端一起工作的方法,当数据发生变化时,可以自动化地标记Backbone.js视图。这样,它可以用于如下的情况: 通常

  • 问题内容: 我有2个模型和1个收藏集。是一个模型,是项目的集合,然后我有一个模型,其中包含: 当我调用该对象时,它得到了所有东西…除了当我在集合中移动时,它们都是类型而不是类型。 我认为这是有道理的,因为除了对象之外,它不知道the 的类型应该是。我可以遍历每个项目并将其转换为对象,但是我希望有一种无需手动进行操作的方法。 这是我的测试代码(在这里使用jsfiddle): 更新:我想到我可以覆盖解

  • 本文向大家介绍Backbone.js框架中Model与Collection的使用实例,包括了Backbone.js框架中Model与Collection的使用实例的使用技巧和注意事项,需要的朋友参考一下 Model 关于backbone,最基础的一个东西就是model,这个东西就像是后端开发中的数据库映射那个model一样,也是数据对象的模型,并且应该是和后端的model有相同的属性(仅是需要通过

  • 出身背景我有数字1到20(黑色背景上的白色数字),可以出现在屏幕上,我希望识别这些数字。由于它们不能简单地复制粘贴,我将比较屏幕上数字的白色像素位置与所有20个数字的白色像素位置列表。然而,每个数字可以有大量的像素,并且可能不需要比较所有这些像素来识别该数字。因此,我希望尽可能少地进行比较。 算法问题:我有多个集合,其中的元素在每个集合中是唯一的,但在所有集合中可能不是唯一的。如何找到每个集合的最

  • 给定一个数据帧say,包含100列和100行,我需要列的子集。我想同时索引两个(或多个)列块。 例如,我想要的是: (显然,这不起作用) 但是我想要第1列到第20列以及第55列到第57列。我可以用两个单独的操作来实现这一点,并将它们连接起来,但我想知道是否有一个功能可以让这一点只需一次(我知道R有这个功能,因此好奇)。 编辑:我在这里发现了一个类似的问题,但答案是字符串。可以进行多个子集设置的解决