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

Причина, по которой нет "набора" для коллекций, заключается в том, что коллекции не являются массивами, они являются наборами, которые потенциально упорядочены. Единственный поддерживаемый способ разместить элемент в определенном месте - это добавить его в коллекцию, а затем отсортировать коллекцию.