铆钉和脊柱js的例子

时间:2013-06-06 07:56:29

标签: spine.js rivets.js

我正在开发一个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 个答案:

答案 0 :(得分:1)

我不是专家,但这似乎是Watch.js的正确适配器配置文件。

但这可能不是你的性能问题。尝试此链接以获得更多性能提示: How to bind deeper than one level with rivets.js

答案 1 :(得分:1)

当您更改模型上的属性时,Spine.js不会发出事件,它只会在您模型上调用save()时触发事件。它也不执行任何类型的脏跟踪,因此您无法获得开箱即用的update:keypath样式事件,它只会触发一个update事件。

这是使用带有Rivets.js的Spine.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将从视图到模型更新模型上的内存中属性(使用双向绑定器,如valuechecked)并且只有在模型上调用save()时才会更新视图(从模型到视图)。这只是Spine.js事件工作方式的一部分。

不幸的是,上述适配器将更新该模型的每个绑定,包括未更改的属性的绑定。或者,您可以使用类似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()结束在UI中反映这些变化。