我最近开始使用 Backbone.js
。我喜欢这个架构,就功能而言,它几乎正是我所需要的...
...但是我发现了以下注意事项:
- 对于
Collection
而言,get
的含义与对于Model
的含义不同。没有设置
。应以常规方式访问属性。我觉得这很不一致。有时很容易混淆模型和集合。有什么办法可以克服这个问题吗? - 在
Model.extend
中分配初始值并不总是有效。例如,分配url
将不会覆盖默认行为。这只能通过调用set()
方法来实现。同样非常容易出错。 - 我仍然不知道是否需要在
initialize()
调用中使用get
/set
。 - 我不明白为什么我不能在
initialize()
中调用_.bindAll(this)
并且我必须列出要绑定(bind)的特定函数名称像这样:_.bindAll(this, firstFunc, secondFunc, ...)
。这不是很干。
我想知道:关于上述情况的最佳做法是什么?您如何使框架更加一致 - 任何猴子补丁?我做错了什么/违反惯例了吗?
如果有任何好的现实世界示例,我将不胜感激。我确实找到了这个:http://documentcloud.github.com/backbone/docs/todos.html和 http://liquidmedia.ca/blog/2011/01/backbone-js-part-1/而那些并没有解决任何提到的问题。事实上,他们只是提出了最简单的想法,绝对没有边界案例,所以任何更复杂的东西都可能有用。
编辑:
好吧,还有一个我不明白的基本想法:
- 是否允许我像这样在扩展上放置额外的属性:
var SomeModel = Backbone.Model.extend({ myattribute: myvalue })
?- 如果是这样,那么为什么对
new SomeModel().get("myattribute")
的后续调用不起作用?
- 如果是这样,那么为什么对
initialize()
中的this
究竟是什么?是模型类还是模型实例?
编辑(2):
好吧,我找到了这个:http://maccman.github.com/spine/ .它看起来像 Backbone.js 2.0,也有相似的名称:)。还没有测试它,这可能有点阻碍,因为图书馆非常最近。然而,从文档方面来看,它看起来很有前途。它消除了我发现的大部分问题,简化了 API,甚至消除了对 underscore.js
的依赖,这对于库来说是一件好事。我会在这里发布我的进一步发现。
最佳答案
好吧,我想我现在可以很自信地说:Backbone 已死,Spine 万岁。
Spine 不完全是 Backbone 的一个分支。然而,它非常相似,并且明显受到某些设计决策的启发。可以说作者尽量保留了原有的backbone API,去掉了不必要的和不合逻辑的东西。我发现它也更容易扩展。更改列表包括:
- 摆脱可怕的
Collection
。而是使用“类方法”, - 充分利用 js 原型(prototype)性质(即不需要
get
/set
)。直接访问属性。需要显式调用save()
才能触发事件。 Views
和Controllers
现在合并为新型Controllers
,它们的目的是响应 DOM 事件并绑定(bind)到模型事件。- 名字:)
我发现这些设计决策连贯且明智。
关于javascript - Backbone.js 及其 API 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5798520/