我正在开发一个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无济于事。
答案 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将从视图到模型更新模型上的内存中属性(使用双向绑定器,如value
或checked
)并且只有在模型上调用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中反映这些变化。