Backbone.js и его путаница с API - PullRequest
15 голосов
/ 27 апреля 2011

Я недавно начал использовать Backbone.js. Мне нравится архитектура, с точки зрения возможностей, это почти то, что мне нужно ...

... Однако я нашел следующие предостережения:

  • Для Collection с get означает нечто иное, чем для Model с. Там нет 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()? Это класс модели или экземпляр модели?

EDIT (2):

Ну, я нашел это: http://maccman.github.com/spine/. Похоже, Backbone.js 2.0, тоже имеет похожее имя :). Пока еще не тестировал, что может показаться чем-то вроде пробной демонстрации, поскольку библиотека очень недавно. Однако со стороны документов это выглядит очень многообещающе. Он избавляет от большинства проблем, которые я обнаружил, упрощает API, даже избавляется от зависимости от underscore.js, что для библиотеки - хорошая вещь. Я опубликую свои дальнейшие выводы здесь.

Ответы [ 2 ]

10 голосов
/ 28 апреля 2011

Хорошо, теперь я могу сказать это с полной уверенностью: позвоночник мертв, да здравствует позвоночник.

Позвоночник не совсем вилка Backbone. Однако он очень похож и явно вдохновлен некоторыми дизайнерскими решениями. Можно сказать, что автор пытался сохранить как можно больше оригинального магистрального API, избавляясь от всего ненужного или нелогичного. Я считаю, что это также легче расширять. Список изменений включает в себя, среди прочего:

  • Избавление от страшных Collection с. вместо этого используются "методы класса",
  • Получение максимальной пользы от прототипа JS (т.е. не требуется get / set). Атрибуты доступны напрямую. Для запуска события требуется явный вызов save().
  • Views и Controllers теперь объединены в новый тип Controllers, целью которого является реагирование на события DOM и привязка к событиям модели.
  • Имя:)

Я считаю эти дизайнерские решения логичными и разумными.

0 голосов
/ 27 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...