JavaScript 下午把玩了一下 SpineJS

fredwu · 2011年12月10日 · 最后由 pobeike 回复于 2012年04月16日 · 10028 次阅读

之前在前公司用了 BackboneJS,整体感觉还不错。后来 SpineJS 重构并用 CoffeeScript 开发,开发速度很快,后起直上,于是我就一直想要把玩一下 SpineJS。

首先,在这里大家可以看到用多种不同的框架做的几乎相同的 Todo 应用:http://addyosmani.github.com/todomvc/

其中有个 SpineJS 的,不过是早前的老的 SpineJS 版本。

这里有个新的 SpineJS 版本的 Todo 应用:https://github.com/maccman/spine.todos

我一边把玩 SpineJS,一边写自己的 Todo 应用版本,下面这个是我写的——

Demo: http://fredwu.github.com/todomvc/todo-example/spine-new/index.html 源码:https://github.com/fredwu/todomvc/tree/master/todo-example/spine-new

感觉比 BackboneJS 好用那么一点点(但其实在实际使用中,差别不大)。:)

前几天我也玩了一下,遇到了这样的问题:

我用 spinejs 重写我的博客 初始化时会把已发布的文章全部获取下来。 需要两份数据,一份是 markdown 原文(编辑的时候用),一份是处理过后的 html(显示的时候用)。 文章一多了数据量就有点大。放到 heroku 之后每次打开都要等半分钟左右。

然后我就想用 fetch 带参数来部分获取,先把 title 取下来 render,再获取正文 但是 fetch 带参数好像有问题,服务器收到的请求大概是这样子的:posts/?[object%2Fobject] 大概是这么写的:

Post.fetch "title": true

请问 我遇到这个问题除了在客户端用 js 处理 markdown 之外,有没有更好的解决办法?

#1 楼 @cqpx 看起来fetch的第一个参数是当成 ID 的

#2 楼 @doitian 还是不行,我一共用了四种写法都不行

.fetch('/posts/1.json?title=true')
.fetch({"page":1})
.fetch(2, {"page":1})
.fetch(2)

只有哪天有时间把源码下下来调一调

Fetch 的参数是 listener function 而已,不能传数据参数的:http://spinejs.com/api/models

#4 楼 @fredwu 但是它这里又这么写了: http://spinejs.com/docs/ajax 搜索“pagination”

Spine's fetch() function takes an optional set of parameters that will be merged into the request options.

class Photo extends Spine.Model
  @configure 'Photo', 'index'
  @extend Spine.Model.Ajax

  @fetch: (params) ->
    params or= {data: {index: @last()?.id}}
    super(params)

文档可能过期了吧,看最新的源码最可靠:https://github.com/maccman/spine/blob/master/src/spine.coffee#L183

编辑:

你那个使用方法需要载入 spine.ajax:https://github.com/maccman/spine/blob/master/src/ajax.coffee#L70

这东西的约定比 Backbone.js 更像 Rails 啊

我看 spine 的 contacts 示例好多 require 实际我查,不能在客户端的 web 中用,只能是 node 啊。 还是有啥技巧呢? 就是在一个文件,用 coffeescript 写一个 class,只能在本文件调用,而不能在其他文件中 new。 除非 class name 加 window 前缀。

#8 楼 @pobeike Spine 可以同时用于浏览器环境和 Nodejs 上,而官方的 contact 示例就是在 node 上用的例子,至于浏览器环境的例子,可以参考 todo。

至于第二个问题,coffeescript 在编译到 javascript 时,会将代码用

(function() {

  // codes here

}).call(this);



的形式包裹,从而使其内部的函数和变量不会污染到全局的命名空间。当某些变量需要在其它文件中互相引用时,则必须将其导出到全局。

#9 楼 @xqunix 多谢多谢。todo 有看,其实主要是想把 model 和 controller 分文件。看来分文件的话只能是导出全局了。spine 就是资料太少,backbone 的资料比较多,peepcode 都有三个视频。

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