【问题标题】:Backbone: Does Collection#get return a copy of the model or the model object itself?Backbone:Collection#get 是返回模型的副本还是模型对象本身?
【发布时间】:2023-03-16 11:38:01
【问题描述】:

我一直难以理解在 Backbone 中操作模型时会发生什么。

1) 当在 Collection 上调用 #get 来“抓取”一个模型时,该模型是否与该集合的模型相同? (例如,更新模型将更新集合的模型)

2) 如果将模型添加到各种集合中,所有这些集合是否都包含实际模型(或模型的“副本”)?在我看来,这是“副本”,因为当我尝试销毁已添加到各个集合中的模型时,并非各个集合中的所有模型都被销毁。

谢谢!欣赏任何见解。

【问题讨论】:

    标签: backbone.js


    【解决方案1】:

    与 Javascript 中的所有其他对象一样,Backbone 对象是“passed by a copy of the reference”。考虑这一点的最好方法是 javascript 在内存中有一段数据,而变量只不过是指向这些数据的指针。当您将一个变量设置为另一个变量时,您真正得到的是指针的两个副本,它们都指向内存中的同一块数据。因此,将此应用于您的问题:

    1. 是的。当您“获得”模型时,您从主干中“获得”的是 指向内存中存储对象的位置的指针。轮到你了 有两个指针(一个在集合中,一个在变量中),您可以对其中任何一个执行操作 并且任何一个都将对相同的数据执行该操作 记忆。
    2. 有点。每个集合都有一个指向同一个集合的指针 对象/模型。当您从集合中删除该指针时, 其他指针仍然指向同一块内存,并且 内存没有被擦除,因为它仍然被其他人指向 收藏品。 model.destroy()will trigger a destroy event on both the model and the collection it is holding a pointer to in it's collection attribute。但是,模型不能保存指针 如果它是多个集合的一部分,则分配给多个集合。 因此,在您的 destroy 事件中,它仅从它最后分配到的集合中删除 - 它包含在 model.collection 属性中。通常,当没有变量在内存中保存指向数据的指针时,该内存将被擦除,但是,在这种情况下,因为您的其他集合具有指向模型的指针,所以模型作为这些集合的一部分保留在内存中。

    【讨论】:

    • 谢谢,非常有帮助。你是怎么学会这一切的?您会推荐一种好的资源吗?
    • 嗯,实际上没有任何一个杀手级资源可以解决这个特定问题。基本的 JavaScript 'pass-by-copy-of-reference' 知识是我在阅读 Stack Overflow 数月后学到的。但是,在具体了解 Backbone 的工作原理时,没有什么可以替代对 documentationannotated source 的彻底检查。
    • 另外,@fibono,如果我的回答有帮助,您应该考虑将其标记为已接受的答案,和/或支持它。 ;)
    • 会的。不幸的是,我是 stackoverflow 的新手,所以当我有足够的声誉时,我会为你投票!
    • 您始终可以通过单击复选标记将答案标记为已接受。它不需要任何特定数量的声誉。
    猜你喜欢
    • 2019-09-17
    • 2011-07-19
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 2020-05-07
    相关资源
    最近更新 更多