2012-02-22 75 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