2011-04-27 63 views
15

我最近開始使用Backbone.js。我喜歡的建築,在功能方面它幾乎正是我需要的...Backbone.js及其API混淆

...但是我發現下面的注意事項:

  • 對於Collection小號get意味着什麼比Model期不同。沒有set。屬性應該以常規方式訪問。我覺得它很不一致。有時候很容易混淆模型和集合。有什麼可以克服的呢?
  • Model.extend中分配初始值並不總是有效。例如分配url不是覆蓋默認行爲。這隻能通過調用set()方法來實現。再次非常容易出錯。
  • 我仍不知道是否需要使用get/set裏面的initialize()來電。
  • 我不明白爲什麼我不能只是在initialize()裏面調用_.bindAll(this),我必須列出特定的函數名,像這樣綁定:_.bindAll(this, firstFunc, secondFunc, ...)。這不是很乾。

我想知道:關於上述情況的最佳做法是什麼?你做什麼來使框架更加一致 - 任何猴子補丁?我做錯了什麼/違反了公約?

我會很感激任何好的現實世界的例子。我確實發現:http://documentcloud.github.com/backbone/docs/todos.htmlhttp://liquidmedia.ca/blog/2011/01/backbone-js-part-1/,那些沒有解決任何上述問題。事實上,他們只是提出最簡單的想法,絕對沒有邊界情況,所以更復雜的事情可能會有用。

編輯:

好,並有一個更根本以爲我不明白:

  • 上午我曾經允許放在擴展這樣的附加屬性:var SomeModel = Backbone.Model.extend({ myattribute: myvalue })
    • 如果是這樣,那麼爲什麼以後不要撥打new SomeModel().get("myattribute")工作?
  • 究竟是this裏面initialize()?它是模型類還是模型實例?

EDIT(2):

好吧,我發現這個:http://maccman.github.com/spine/。它看起來像Backbone.js 2.0,也有類似的名字:)。還沒有測試過,這可能是一個顯示停止位,因爲圖書館最近非常。然而從文檔方面看,它看起來非常有前景。它消除了我發現的大多數問題,它簡化了API,它甚至擺脫了對圖書館來說依賴於underscore.js的好處。我會在這裏發表我的進一步發現。

+0

好問題,我也發現Backbone有點奇怪。你應該添加你的發現作爲你自己問題的答案。 – brianpeiris 2011-04-27 21:48:30

+0

@brianpeiris我會盡快確定它確實可用。到現在爲止還挺好。脊柱真的好像被深思熟慮。 – julkiewicz 2011-04-27 22:44:51

回答

10

好的,我想我現在可以相當自信地說出來了:骨幹已經死了,脊柱長壽。

脊柱並不完全是Backbone的分支。然而,它非常相似,並且受到一些設計決定的啓發。可以這樣說,作者試圖儘可能保留原有的骨幹API,擺脫不必要的或不合邏輯的事情。我發現它也更容易擴展。變化清單包括其中包括:

  • 擺脫可怕的Collection s。 「類方法」被用來代替,
  • 獲得最大的js原型性質(即不需要get/set)。屬性直接訪問。爲了觸發事件,需要明確地致電save()
  • ViewsControllers現在合併爲新類型Controllers,其目的是響應DOM事件並綁定到模型事件。
  • 名字:)

我發現那些設計決策連貫和明智的。

+0

我更傾向於脊椎。我一直在使用Backbone,get('property')不僅在代碼中,而且在模板中都很痛苦。這是我與BackBone唯一真正的牛肉。 我希望Spine有一個View類。如果您查看元素設計模式,那麼View w/Collection就在Backbone中。 – mgutz 2011-05-04 08:15:24

+0

@mgutz嗯,它可能是一個設計模式,但我總是發現集合冗餘。而且這是非常痛苦的,因爲它們實際上是需要的(URL的默認構建方式)。你也可以在Spine中收藏Collections,而不是在Backbone中收藏Collections。 – julkiewicz 2011-05-04 14:45:21

+0

@julkiewicz骨幹死了嗎?你的答案已經超過一年了......它仍然準確嗎? – 2012-07-26 16:14:29

0

集合沒有「集合」的原因是集合不是數組,它們是集合,它們可能是有序的。將元素放置在特定位置的唯一支持方式是將其添加到集合中,然後對集合進行排序。

+0

這不是我的意思。對於'模型''get()'意味着返回一個屬性的值。集合可以有,也有屬性 - 就像'.url'一樣。但'get()'保留用於訪問項目。我不會親自命名兩個完全不同的功能 - 這是我的觀點。 – julkiewicz 2011-04-27 02:30:49

+0

我明白了。但你也說過「沒有一套。」 – 2011-04-27 02:36:39

+0

同樣,'模型'的'set()'意味着設置一個屬性。但是對於一個集合,我應該直接設置屬性。這更加令人困惑,因爲可能會錯誤地將其做成模型,並且無法觸發適當的觸發器。 – julkiewicz 2011-04-27 02:39:27