Backbone.js的 - 如果嵌套视图保持相互之间的引用?(Backbone.js - Shou

2019-06-23 11:34发布

如果一个骨干视图创建其渲染()方法中的新观点,应该将这些意见被保持为数据成员? 一个典型的渲染方法是这样的:

render: function() {
  var myView = new MyView({ model: values });
  $('div#value', this.el).append(myView.render().el);
}

这种链接的渲染方法意味着嵌套的看法是真的只有建立这样,它也可以链接任何渲染方法,并返回一个很好的构建元素。 该视图是留给垃圾收集我承担?

如果嵌套视图将被修改......或许很大程度上,它应该只是被(重新)创建,或者是否应该通过数据成员引用修改?

我遇到的问题是嵌套视图收到要求他们修改自己的嵌套视图他们的父母观看赛事,有时候。

我真的不希望顶部开始投掷听众到处。 并要求在引用传递给父视图和渲染()在内存泄漏的孩子查看结果,因为父进程会创建一个新的子视图,而原来的子View保持对其父的参考!

这只是不太框状的时刻。 有没有人有这将有助于我以同样的方式一帧作品的解决这个问题的任何资源?

Answer 1:

(警告:我的回答变成了TL;博士论文)

我有一些这些同样的问题早,并且已经做了功课,以建立一些非常复杂的应用程序,所以我会提出我的观点。

与学习骨干最大的挑战是,它是如此unopinionated,可以是(现在也是)在很多不同的方式,它是很难搞清楚如何做“正确的”,或者至少在一个良好的方式使用,当你开始出。 有不只是一个使用骨干正确的方法,但它的灵活性使它成为一个真棒结构几乎任何应用程序,并希望我能帮助提供一些指导。 (我大概可以附加“IMO”,以每一句话在这里)。

首先,我的看法骨干理解

在骨干网的应用程序,也有很多有用的方法来使用的意见。 我一般看到一些重叠类型的意见,我的应用程序:

我通常有一个或多个“根级别”的观点。 根级别的观点往往初始化,渲染,并保持到处理页面的特定部分子视图引用的地方。 的el根级视图的往往是“体”或身体内的另一高电平元件。 在某些情况下,根级视图都有自己的HTML观察和/或渲染。 在其他情况下,根级视图可能没有el可言,只是管理孩子的意见。 我保持到每一根级别视图的参考(经常存在只有一个)在全局“应用”命名空间对象。

除“根级别”的观点,通常有“子视图”。 子视图被初始化并通过一个“父”视图,其可以是一个根级别视图或另一个子视图中呈现。 家长的意见是负责初始化,渲染,隐藏,显示和/或应用程序需要摧毁他们的孩子。 有时,一个父视图可以跟踪孩子浏览的情况下的可变数量的(例如,一个PlaylistView有N个SongViews)。 通常情况下,父母保持到孩子的引用,但有时却是不必要的(详见下文)。

除“根级/父/子”的模式,我倾向于认为的观点分为两类之一:(1)静态的:这意味着一旦视图被初始化,视图及其el围着,即使里面的东西它的变化; (2)动态的,来来去去,基于各种事件。 通常情况下,我的根级别的观点总是静态的。 他们通常也对应于现有的DOM元素,例如,“体”或“#我-DIV”。 儿童的意见往往是动态的,但可能是静态的为好。 (温馨提示:使用el: '#element-id'使用现有的DOM元素作为el声明静态视图时动态视图通常不指定现有的。 el ;他们使用的tagName idclassName来描述元素的动态视图会产生)。

意见主要有3个功能:(1)当被告知必须由父母或响应事件,这样做使自己和子女(或根级视图的情况下,当一个路由器或“主”函数初始化等),(2)从他们中的DOM元素UI事件作出响应el (但不是内el任何子视图)通过更新模型或集合或触发定制骨干事件,以及(3)观察和骨干回应(模型,收集等)需要的东西呈现或它们的埃尔内改变(但不是所有子视图的埃尔内的事件。)一个有时是有用的技巧是儿童的观点可以触发事件本身( this.trigger('customEvent')该父视图能观察( childView.on('customEvent', this.handler, this) )。

有关骨干视图模式中的附加有趣的观点看: 这个和这个 。

现在,在这种情况下,上问题

1)的垃圾收集范围,并且,内存泄漏恐惧

如果您在父实例化一个子视图作为一个局部变量的渲染(或其他)方法和渲染它,那么函数超出范围,我能理解你的垃圾收集的恐惧或视图将无法做它需要做的。 没有必要担心垃圾收集,只僵尸。 如果您认为有任何事件处理程序无论如何,在“事件”的声明,或以其他骨干对象绑定是否宣布UI事件处理程序的事件,或其他基于DOM事件监听器,你的观点就不会被垃圾收集,即使你不”吨有对它的引用了 - 它仍然存在于内存和响应事件。 在另一方面,如果一个观点没有任何事件处理程序,那么它的唯一工作就是渲染的元素,所以谁在乎如果呈现它的JavaScript对象支左右 - 它可能会被垃圾收集,因为它应该是。 见这个 ,对于JS垃圾收集的一般非常了解,以及如何它涉及到Backbone.js的。

更大的担忧是僵尸的看法 。 如果意见是从DOM移除,并在您的应用程序的一些基本点丢弃,然后确保他们要么完全删除自己或父母的意见应保持对它们的引用并删除它们。 不要重新创建并替换那些已经被创建并未被完全去除的看法。 去除是通过调用一个.remove()的观点,再加上解除绑定您正在使用以前绑定任何外部骨干事件完成on(...)使用off(...) 骨干网的最新版本(1.0以上版本)使这个问题更容易被添加解决“listenTo”和“的stopListening”的方法来查看原型。 了解和使用这些方法,而不是开/关,如果你动态添加的意见,并从DOM。 提示:建立一个哈克jQuery的“删除”事件这样一个可以很容易地使视图自动删除和清理自己当他们的el从DOM删除(在事件没有在你的应用程序流事件可以达到同样的目的)。

2)如果孩子的意见被维持的父视图的数据成员?

这取决于。 我不认为父母的意见是知道的有限目的,其子视图违反了MVC的任何黄金原则。 有时,具有特定的子视图实例成员引用父是,如果/当你需要它来管理孩子的意见的好方法。 正如我指出的,有时父母的意见回应称要求他们渲染,重新渲染,隐藏或删除其子视图的事件。 有时,他们可能要听那个孩子的意见对自己的触发事件。 父母,但是,不应该太卷入任何内部子女的意见的el的虽然。

这就是说,不要过度地使用这些类型的引用。 很多时候,你将不再需要使用子视图的引用,因为孩子们可以自己照顾自己。 正如我所说,观点,一旦呈现,应该只A)看他们的埃尔内UI事件(但通常不是内部的任何子视图的EL)和更新模型或集合或触发事件以响应这些UI事件,或B)观看与其他骨干对象的事件(通常是模型或集合或其它视图)和采取行动(例如,更新自己的UI元素)响应。 在许多情况下,一个视图可以自己照顾自己,甚至自身删除。 如果另一个查看或其他骨干对象在乎UI事件在视图发生,更新模型或触发视图事件,让他们观察它。 同样,如果你的视野之外的东西需要你查看更新的渲染,听更改模型或等待一个相应的自定义事件。 作为一般原则,意见应该是一无所知对方,与父母照看自己的孩子时,它是有道理的除外。

3)如果孩子的意见保持父视图的引用?

没有永不。 我无法想象一个场景,你需要通过到无法通过更改父被观察的模型,或者触发事件来完成父的引用来完成的东西(例如,一个自定义事件说“哎,X事”)在子视图本身或另一骨干“活动”为主的对象。 在骨干网中,我使用模型来表示我的两个数据,我的状态。 所以,如果东西改变我的应用程序的状态的视图发生了,我再改模型的相应状态属性,并让其他意见(包括家长)听自动“改变”事件,如果他们不在乎。 我也用一个全球性的“发泄”公交样的对象(只是扩展Backbone.Events一个基本的JavaScript对象)触发,并监听整个应用程序的活动,有时候我触发意见本身,让父对象知道事情发生的事件。 无论工作,同时保持你的架构解开越好。

4)我真的不希望顶部开始投掷听众到处。

嗯,我想大约骨干一个好处是,你不必,但要意识到观察者模式(即事件和监听器)和松耦合是在MVC的骨干味道心脏(请注意,每一个骨干类扩展活动?),大多数人因此使用它。

参考文献?

我强烈建议PeepCode教程 ,除非你觉得你在一个相当先进的水平是已经。 12块钱一张,但你需要开始与第一个或第二个和第三个将不会是非常有用的。

此外, 这里有一个很好的概述 。

结束



文章来源: Backbone.js - Should nested Views maintain references to each other?
标签: backbone.js