Backbone.js 中的模型

Posted

技术标签:

【中文标题】Backbone.js 中的模型【英文标题】:Models in Backbone.js 【发布时间】:2012-02-15 08:31:24 【问题描述】:

我有一个关于处理我的模型的问题。我都糊涂了。当我加载页面时,我从包含“事件”的 Rails 中获得一个 JSON 字符串,这些事件依次具有一个用户、多个参与者、多个付款和多个 cmets,这些 cmets 又具有一个用户,并且这些付款有多个用户和一个单用户。 cmets 和 payment 也有一个指向父节点的事件。

Events
  User
  Participants(users)
  Payments
    User
    Users
    Event
  Comments
    User
    Event

好的,所以问题是:我是否应该将所有内容都加载为树,并且到处都有完整的属性:

"events": 
  "id": "event_1",
  "user": 
    "id": "user_1", "name":"name"
  , "participants": [
    "id": "user_1", "name":"name",
    "id": "user_2", "name":"name"
  ], "payments": [
      "id":"payment_1",
      "user": 
        "id": "user_1", "name":"name"
      ,"users": [
        "id": "user_1", "name":"name",
        "id": "user_2", "name":"name"
      ], "event": root event object  
    ], "comments": [
      "id": "comment_1",
      "user": 
        "id": "user_1", "name":"name"
      , "event": root event object  
    ]
  

然后有事件模型,创建新的 cmets、支付和用户,并将其分配给它自己的事件,或者将每个事件、用户支付和评论加载到单独的变量中,然后使用变量来获取模型。 这很难解释,所以请随时询问我是否需要澄清一些事情。

结论:我应该让事件模型处理所有嵌套对象的创建,还是有更好的方法来处理这个,并且可以更全局地访问模型?

【问题讨论】:

您可能想研究使用 backbone-relational 并为用户、参与者、事件等建立一个模型......可能您已经在 ruby​​-on-rails 中以类似的方式对待它们跨度> 【参考方案1】:

架构是主观的,但我会这样做 -

3 个基本模型

User = Backbone.Model.extend(
    defaults : 
        name : ""
    
)
Payment = Backbone.Model.extend(
    defaults : 
        user : new User(),
        users : new UserList(),
        event : ""
    
)
Comment = Backbone.Model.extend(
    defaults : 
        user : new User(),
        event : ""
    
)

3 个集合

UserList = Backbone.Collection.extend(
    model : User
)
PaymentList = Backbone.Collection.extend(
    model : Payment
)
CommentList = Backbone.Collection.extend(
    model : Comment
)

单事件模型

Event = Backbone.Model.extend(
    defaults : 
        user : new User(),
        participants : new UserList(),
        payments : new PaymentList(),
        comments : new CommentList()
    
)

如果您在上面的示例中使用 JSON 初始化您的事件对象,它应该可以正常工作。将来,如果您想将用户分离到不同的 API,此代码也应该支持。如果您以后确实想让组件对象在全局范围内可用,您可以从用户对象中获取它,即 window.User = myEvent.get("user")

希望这会有所帮助:)

【讨论】:

【参考方案2】:

我不会。我会通过对象特定的调用使 rails 端尽可能简单。是的,这确实意味着您将进行更多调用以获得完整的图片,但最终它会更容易维护,并且对一个对象的更改不需要在一堆其他对象中进行级联更改。例如,如果您需要在名称之上添加其他用户属性怎么办?

换句话说,Eve​​nt 就是一个事件对象。它通过 id 引用其他对象。这些对象中的每一个都有自己的模型类和相应的 API url。因此,您需要在需要时从 API 获取用户对象(通过 id)。

【讨论】:

以上是关于Backbone.js 中的模型的主要内容,如果未能解决你的问题,请参考以下文章

Backbone.js:组合多个模型的复杂视图

Backbone.js - 正确的模型初始化

Backbone.js 模型与集合

模型和集合到 Backbone 中的一个视图

Backbone.js 将模型添加到集合问题

将集合绑定到 Backbone.js 中的视图