Пример заклепок и позвоночника

Я работаю над приложением Spine, которое пользователи клепают js вместо шаблонного движка, и до сих пор я в восторге от привязок заклепок, мои взгляды более лаконичны и читабельны, и у меня есть четкое разделение проблем: мои контролеры заботятся только о управляя состоянием приложения, мои модели выполняют постоянную работу, а мои собственные привязки заклепок и средства форматирования заботятся о форматировании значений и массировании пользовательского ввода. Все идет нормально.

Единственное, что меня беспокоит, так это то, что я использую watch.js, и я подозреваю, что часы отвечают за проблемы с производительностью iphone, и мне это не слишком удобно.

На сайте заклепок JS говорится, что он поддерживает Spine, хотя я не смог найти ни одного примера, не говоря уже о фрагменте.

Единственный адаптер, который работает как для контроллеров, так и для моделей, которые я мог придумать, это:

rivets.configure adapter:
  subscribe: (obj, keypath, callback) ->
    watch obj, keypath, callback

  unsubscribe: (obj, keypath, callback) ->
    unwatch obj, keypath, callback

  read: (obj, keypath) ->
    obj[keypath]

  publish: (obj, keypath, value) ->
    obj[keypath] = value

Есть ли лучший способ связать заклепки с моделями позвоночника и контроллерами?

Я боролся с Object.defineProperty безрезультатно.

2 ответа

Решение

Spine.js не генерирует события, когда вы изменяете атрибуты модели, он только генерирует событие, когда вы вызываете save() на модели. Он также не выполняет никакого грязного отслеживания, поэтому вы не получите update:keypath события стиля из коробки, он просто запускает один update событие.

Вот стандартный адаптер для использования моделей Spine.js с Rivets.js.

rivets.configure
  adapter:
    subscribe: (obj, keypath, callback) ->
      obj.bind "update", callback

    unsubscribe: (obj, keypath, callback) ->
      obj.unbind "update", callback

    read: (obj, keypath) ->
      obj[keypath]

    publish: (obj, keypath, value) ->
      obj[keypath] = value

Используя вышеуказанный адаптер, Rivets.js будет обновлять атрибуты в памяти на ваших моделях при переходе от представления к модели (используя двустороннее связующее, такое как value или же checked) и обновит представление (переход от модели к представлению) только при вызове save() на модели. Это только часть того, как работают события Spine.js.

К сожалению, вышеприведенный адаптер обновит каждую привязку для этой модели, включая привязки для свойств, которые не изменились. В качестве альтернативы вы можете использовать что-то вроде https://github.com/mitchlloyd/Spine-Attribute-Events, которое выполняет базовое грязное отслеживание и запускает дополнительное update:keypath событие стиля для атрибутов, которые изменились. Это будет гораздо более эффективным с точки зрения операций DOM, поскольку мы обновляем только то, что необходимо обновить.

rivets.configure
  adapter:
    subscribe: (obj, keypath, callback) ->
      obj.bind "update:" + keypath, callback

    unsubscribe: (obj, keypath, callback) ->
      obj.unbind "update:" + keypath, callback

    read: (obj, keypath) ->
      obj[keypath]

    publish: (obj, keypath, value) ->
      obj[keypath] = value

Как видите, это дает Rivets.js более детальный способ подписки на отдельные изменения атрибутов. Основная идея здесь заключается в том, что Rivets.js теперь будет обновлять только части DOM для атрибутов, которые изменились.

Опять же все это происходит только когда вы звоните save(), что на самом деле хорошая функция, потому что вы можете сделать столько промежуточных изменений в модели, сколько хотите, а затем вызвать save() в самом конце, чтобы эти изменения были отражены в пользовательском интерфейсе.

Я не эксперт, но это, кажется, правильный файл конфигурации адаптера для Watch.js.

Но это не может быть вашей проблемой производительности. Попробуйте эту ссылку для получения дополнительных подсказок по производительности: Как связать глубже, чем один уровень с rivets.js

Другие вопросы по тегам