Backbone.js и путаница API
Недавно я начал использовать Backbone.js
. Мне нравится архитектура, с точки зрения ее функций почти точно, что мне нужно...
... Однако я нашел следующие оговорки:
- Для
Collection
get
означает нечто иное, чем для Model
s. Нет set
. Атрибуты должны быть доступны обычным способом. Я считаю это довольно непоследовательным. Легко смешивать модели и коллекции. Есть ли что-то, что можно сделать, чтобы преодолеть это?
- Назначение начальных значений внутри
Model.extend
не всегда работает. Например, назначение url
не приведет к переопределению поведения по умолчанию. Это может быть достигнуто только путем вызова метода set()
. Снова очень склонна к ошибкам.
- Я все еще не знаю, нужно ли использовать
get
/set
внутри initialize()
.
- Я не понимаю, почему я не могу просто вызвать
_.bindAll(this)
внутри initialize()
, и мне нужно указать конкретные имена функций, которые будут связаны следующим образом: _.bindAll(this, firstFunc, secondFunc, ...)
. Это не очень СУХОЙ.
Я хотел бы знать: каковы наилучшие практики в отношении упомянутых ситуаций? Что вы делаете, чтобы сделать структуру более последовательной - любой патч обезьяны? Я делаю что-то неправильно/против конвенции?
Буду благодарен за любые примеры хорошего реального мира. Я нашел это: http://documentcloud.github.com/backbone/docs/todos.html и http://liquidmedia.ca/blog/2011/01/backbone-js-part-1/, и те, которые не затрагивают ни одного из упомянутых проблемы. На самом деле они просто представляют простейшие идеи и абсолютно никаких пограничных случаев, поэтому может быть полезно что-то более сложное.
EDIT:
Хорошо, и есть еще одна фундаментальная мысль, которую я не понимаю:
- Мне разрешено добавлять дополнительные атрибуты в расширение следующим образом:
var SomeModel = Backbone.Model.extend({ myattribute: myvalue })
?
- Если да, то почему последующие вызовы
new SomeModel().get("myattribute")
не работают?
- Что такое
this
внутри initialize()
? Является ли модель образцом модели или модели?
ИЗМЕНИТЬ (2):
Ну, я нашел это: http://maccman.github.com/spine/. Похоже, Backbone.js 2.0, имеет аналогичное имя тоже:). Еще не проверял его, что может быть немного показательным стоппером, так как библиотека совсем недавно. Однако со стороны документов он выглядит очень перспективным. Он избавляется от большинства проблем, которые я нашел, он упрощает API, он даже избавляется от зависимости от underscore.js
, которая для библиотеки - это хорошо. Здесь я расскажу о своих дальнейших результатах.
Ответы
Ответ 1
Хорошо, я думаю, что могу сказать это довольно уверенно: Магистраль мертва, долго живет в Спайне.
Позвоночник - это не только вилка Магистра. Однако он очень похож и явно вдохновлен некоторыми дизайнерскими решениями. Можно сказать, что автор пытался сохранить столько, сколько возможно, оригинального базового API, избавляясь от всего ненужного или нелогичного. Я нахожу это также легче расширить. Список изменений включает, среди прочего:
- Избавиться от ужасных
Collection
s. Вместо этого используются "методы класса",
- Получение большинства из прототипического характера js (т.е. no
get
/set
). Доступ к атрибутам осуществляется напрямую. Явный вызов save()
требуется для запуска события.
-
Views
и Controllers
теперь объединены в новый тип Controllers
вместе, целью которого является реагирование на события DOM и привязка к событиям модели.
- Название:)
Я нахожу эти конструктивные решения последовательными и разумными.
Ответ 2
Причина, по которой нет "набора" для коллекций, заключается в том, что коллекции не являются массивами, они являются наборами, которые потенциально упорядочены. Единственный поддерживаемый способ разместить элемент в определенном месте - это добавить его в коллекцию, а затем отсортировать коллекцию.