对 Backbone + React 应用程序中的模型的困惑

Posted

技术标签:

【中文标题】对 Backbone + React 应用程序中的模型的困惑【英文标题】:Confusion about Models in Backbone + React application 【发布时间】:2015-09-29 10:27:39 【问题描述】:

这是一个使用 Backbone 和 React 的 example。

他定义了一个Modelvar _todos = new Backbone.Model();

然后给它添加两个函数:

var TodoStore = _.extend(_todos, 
  areAllComplete: function() 
    return _.every(_todos.keys(), function(id)
      return _todos.get(id).complete;
    );
  ,
  getAll: function() 
    return _todos.toJSON();
  
);

我不明白为什么areAllComplete 被应用于Model 而不是Collection

这不应该是 Collection 中的一个函数,它将获取其所有模型并检查 complete 属性。

同样,我希望 getAll 属于 Collection - 获取它的所有模型。

此示例似乎将Collection 替换为Model

也许我不完全了解模型是如何使用的。

【问题讨论】:

我不明白你为什么要混合 Backbone 和 Flux。 Re:model v 集合,这取决于您如何将它们存储在服务器上。这里看起来模型实际上是一个待办事项的列表,每个项目只是作为该模型上的一个属性被键入。整件事对我来说似乎很愚蠢。 @Mathletics 是否有理由不将两者一起使用? React 只是“MVC 中的 V”,对吧?我想使用 Backbone 进行路由和存储。我一直在考虑这个approach。 我的回应是考虑到 React。这是你的意思吗?或者我为什么要特别使用带有 Backbone 的 Flux 架构? 我是认真的;我不明白将 Flux 与 Backbone 混合使用。 Backbone 已经处理数据存储和事件。 (尽管我承认我并不精通 Flux。) 【参考方案1】:

在我看来,该示例以一种相当奇怪的方式使用 Backbone.Model

This 是它向商店添加新待办事项的地方:

var id = Date.now();
  _todos.set(id, 
    id: id,
    complete: false,
    text: text
  );

它的基本作用是将每个待办事项设置为Model 的属性,使用id 作为属性名称。它以_todos.attributes 结束,如下所示


  "1436600629317": 
    "id": 1436600629317,
    "complete": false,
    "text": "foo"
  ,
  "1436600629706": 
    "id": 1436600629706,
    "complete": false,
    "text": "bar"
  

这与您从 _todos.toJSON() 获得的输出相同。我不知道他们为什么决定这样实现它,如果他们尝试使用 Backbone.Sync,他们最终会得到一个不完全 RESTful 的服务器 API。在不利用 Backbone 提供的任何东西的情况下使用 Backbone 似乎很奇怪。有对change 事件here 的引用,但我没有看到它在任何地方使用。您可以使用任何常规 JS 对象轻松地重新实现该存储。

该示例似乎在 Backbone 中实际使用的唯一内容是调度程序中的 Backbone.Events。您完全正确,使用 Collection 会更有意义,因为这样您实际上可以使其与基于 REST 的服务器 API 对话。该示例似乎只是为了使用 Backbone 而使用 Backbone。

【讨论】:

以上是关于对 Backbone + React 应用程序中的模型的困惑的主要内容,如果未能解决你的问题,请参考以下文章

React-Redux 应用程序真的可以像 Backbone 一样扩展吗?即使重新选择。在移动

我对Backbone.js的一些认识

使用Backbone View作为React组件

我可以将 Backbone 与 React Native 一起使用吗?

React + Backbone,目标容器不是 DOM 元素

Backbone Backbone初探