2012-02-22 67 views
13

我有一个定期的宁静模型,我得到,创建,删除和更新。最重要的是,我想调用该模型的特殊操作,如change_password。Backbone.js在宁静的模型上使用非宁静的动作

常规REST风格的路线是传统的Rails 3条路线:

fetch => GET /api/models/:id 
save => PUT /api/models/:id 
create => POST /api/models 
destroy => DELETE /api/models/:id 

但是,在这些之上,我有特殊的操作:

changePassword => GET /api/models/:id/change_password 
activate  => GET /api/models/:id/activate 

等。

我需要在模型上设置什么,以便识别这些新操作以及如何将调用包装到模型方法中?

回答

30

将新方法添加到模型非常简单 - 只需在.extend()中指定新方法即可。你必须编写一些这方面的事情,但你可以利用现有的机械像Backbone.sync(大多只是围绕$.ajax()的包装)和Model现有url属性:

var MyModel = Backbone.Model.extend({ 

    activate: function(opts) { 
     var model = this, 
      url = model.url() + '/activate', 
      // note that these are just $.ajax() options 
      options = { 
       url: url, 
       type: 'POST' // see my note below 
      }; 

     // add any additional options, e.g. a "success" callback or data 
     _.extend(options, opts); 

     return (this.sync || Backbone.sync).call(this, null, this, options); 
    }, 

    // etc 

}); 

正如一个评论,从静止的角度,您的changePasswordactivate操作应该是而不是是GET方法 - 所有GET方法都应该是幂等的。这不仅仅是RESTifarianism,它是一个好主意 - 你最终可能会缓存这些URL(所以什么都不会发生),或者偶然发生多次(通常需要用户通过POST请求进行确认)。如果可以,请进行这些POST调用。

+2

感谢您对GET此言与POST,我会改变他们的肯定。 – kolrie 2012-02-22 20:29:38

+0

'POST'参数似乎不起作用。 'CLICK'动词似乎被用来代替(Chrome)。 – 2012-10-29 15:28:52

+0

不确定你的意思 - HTTP中没有'CLICK'动词,所以? – nrabinowitz 2012-10-29 17:26:11

8

我会建议,如果可能的话,添加一个密码模型/控制器,您可以拨打保存来更改密码。这是继REST标准,并建立在Backbone.js的

的功能,如果这不是一个选项,下面是一个例子的CoffeeScript,添加到您的模型:

activate: -> 
    unless user.get('active') 
    (@sync || Backbone.sync).call @, 'activate', @, 
     url: "#{@url()}/users/#{message.get('id')}/activate" 
     data: {} 
     complete: => 
     user.set(active: true) 
     @set(active: true) 
+0

为什么不工作:'成功:=> console.log'成功'(而不是完整)? – itsnikolay 2014-01-19 18:07:30