让模型听嵌套模型和集合的最佳模式?

2022-01-24 00:00:00 javascript backbone.js coffeescript

使用 Backbone.js 让模型一直监听所有嵌套模型和集合的最佳模式是什么?

Using Backbone.js what is the best pattern to have models listen to all of their nested models and collections all the way down?

我应该将嵌套模型/集合放在属性中吗?我应该手动创建父母关系并触发事件吗?

Should I put nested models/collections in attributes? Should I create parental relationships and trigger events manually?

推荐答案

与大多数 Backbone.js 一样,你不会得到正确"的答案,但我可以分享我是如何做到的.对于模型和视图,我通常遵循以下准则:

As with most things Backbone.js, you won't get a "right" answer to this, but I can share how I do it. With both models and views, I generally follow these guidelines:

  • 视图和模型应该由对它们负责"的组件实例化.对于具有明确父子关系的模型或视图,父模型应该实例化,通常在 initialize() 方法中.

父母应该在实例化时绑定到子事件.

Parents should bind to child events at the time of instantiation.

父母应该意识到"孩子,并且可以在必要时调用子方法 - 我通常会使用此方法而不是触发子事件,因为它更明确.我试图让孩子们独立于他们的父母,通过事件向上沟通.所以是的,深度嵌套的模型将通过事件链进行通信.

Parents should be "aware" of children, and can call child methods if necessary - I'd usually use this method over triggering a child event, as it's more explicit. I try to keep children independent of their parents, communicating upwards through events. So yes, deeply nested models would communicate through event chains.

我有时将 .set() 子属性作为 Backbone 属性,但通常只使用普通的 Javascript 属性(例如 this.child).这取决于上下文.使用 Backbone 属性提供 change 事件,因此如果您需要监视子项是否更改,请使用它们.骨干属性还使您能够在实例化时进行设置,例如var myModel = new Model({ other: otherModel }) - 但是因为父母通常会实例化他们的孩子,所以这并不真正适用于这种情况,我通常将该模式用于非分层模型 -模型关系.在大多数情况下,我将孩子设置为纯 Javascript 属性.

I sometimes .set() children as Backbone attributes, but usually just use plain Javascript attributes (e.g. this.child). It depends on the context. Using Backbone attributes provides change events, so if you need to monitor whether a child changes, use those. Backbone attributes also give you the ability to set at instantiation time, e.g. var myModel = new Model({ other: otherModel }) - but because parents usually instantiate their children, this doesn't really apply in that case, and I usually use that pattern for non-hierarchical model-model relationships. In most cases, I set children as plain Javascript attributes.

相关文章