JavaScript 一些关于单页 JS App 的问题

andrew_qx · 2012年04月21日 · 最后由 doitian 回复于 2012年04月22日 · 4120 次阅读

最近在写一些 js one-page app, 用过 spine.js,backbone 这类 mvc 框架 ,遇到一些问题,总感觉自己的解决方法比较简陋。

  1. backbone 这类框架,模型层一般都在内存中有缓存,有一些场景中模型的持久化操作,需要在服务器端批量进行,甚至有些操作是在服务器端 Model 的 after/before_update 的 callback 中进行的,这时候需要通知客户端更新内存中的模型。从而更新 view.

    我当前的方法:

    • 在客户端重复服务器端的逻辑,分别更新 优点减少网络通讯,提高反应速度 缺点需要重复模型层的逻辑代码
    • 在更新操作的结果中作为 json 返回所有更新的模型 优点 代码重复量小 缺点 如果更新的数据量大,则通讯量很大,有些数据可能根本用不到,有些则和更新本身不直接相关,另外由于界面要等更新操作返回才更新,达不到'异步'的效果。
  2. 在上面的问题基础上,有些模型可能只是更新部分属性,而 backbone 中一般都是当模型更新时重绘整个绑定的视图。这样可能导致视图当前状态的丢失 (比如滚动位置,编辑器内容等)

    我当前的方法:

    • 具体问题具体解决 (比如在更新前克隆当前视图状态,重绘完以后恢复) 缺点 缺乏通用性,代码可能比较冗长

以上两个问题,我 google 了一下,找到一些 realtime app 的解决方案,比如 http://derbyjs.com/ 这个框架,能够实时同步 server/client 的模型,并且还能通过类似 xpath 的语句监控某个模型的某些属性。但这类方案一般都比较不成熟,也比较复杂。

请问各位前端高手,有没有比较完美的 pattern 或者心得可以分享一下吗?

用 juggernaut 或者 faye 之类的把要更新的数据发回客户端可以么? 以前写书签站,保存的时候,只存下 url 服务器就返回,客户端就更新。然后服务器会开个 worker 去抓那个 url 的内容然后做一些处理,然后再把需要客户端更新的数据用 juggernaut 发回客户端,客户端再刷新。用的 spinejs。 不知道跟你说的是不是类似的情况。。

第二个问题我也想知道。。我现在是直接用 jquery 替换需要替换的内容。。没有 bind model...

最近比较火的 meteror.js 不知道派得上用场不。。看视频好像很炫。。我还没时间去研究它怎么用。。

#1 楼 @cqpx 是可以用 server push persist 方法,不过似乎差别不大,我主要是说的是关联更新的情况,比如说有一个 rails 的模型 Post 关联了多个 tag 模型 , Post 里有个字段 tag_string, 在 save 时候 Post 模型会根据这个字段来更新相关的 tag 的 post_count, 而客户端页面上会显示 Post 和 所有的 Tag, 当你更新 post 修改了 tag_string 时候,客户端的界面上也应该更新这些 tag 所含的 post 数量,这里大前提是不刷页 , 那我现在似乎也只能在 js 里去更新 tag 了,而这样似乎就重复了服务器上的逻辑。想找个完美一点的方案

不如下次我们 RubyTuesday 活动专场探讨一下 real-time 的 js-single-page-app?

  1. 想即时点客户端肯定要加逻辑。
  2. 部分更新可以绑定 bind 'change:xxx',我在一个项目是实现了个简单的 data-bind,效果不错。另外 View/Controller 尽量简单,如果某个控件需要经常性重绘,可以单独弄个 View/Controller,可以参考下 backbone-patterns 的 Sub Views 和 Delegate Views

#6 楼 @doitian 感谢~ 我再去研究下

需要 登录 后方可回复, 如果你还没有账号请 注册新账号