2013-05-10 39 views
3

我需要通知我的網頁用戶從服務器返回的model.save()調用。如何從model.save()的骨幹成功回調中觸發視圖事件?

這種情況是這樣的:點擊觸發視圖中的getAnswer(),這會輪流觸發模型方法getAnswerServer(),該方法在模型上調用.save(),該方法傳遞一個訪問響應的成功回調。

但是,我該如何通知用戶(通過使用視圖事件或其他任何東西)響應是什麼?

這裏就是我有我的觀點:

events: {"click button#active" : 'getAnswer'}, 

initialize: ... 
render: ... 

getAnswer: function() { 

     this.model.getAnswerFromServer(); 
    }, 

型號:

getAnswerFromServer: function() { 

    this.save({myAnswer1 : false}, {success: function(model, response) { 

       answer = model.get('answer'); 

       if (answer === true) { 
        console.log("The answer is true! But how do I tell the user about it?"); 
       } 
       else if (answer === false) { 
        console.log("The answer is false! But again, how do I tell this to my user?"); 
       } 
      }}); 
} 

我非常希望能夠在這裏調用事件處理程序,並在不同的視圖觸發事件,但我不知道如何從成功回調中訪問它?實際上,即使觸發此視圖的自定義事件也足夠了。

謝謝!

回答

3

您可以隨時在你想顯示

選項1

// The view that you would like to show 

    initialize: function() { 
      this.listenTo(this.model, 'sync', this.render); 
    } 

這將被稱爲視圖使用sync event時被保存同步與服務器的模式。

但是,如果你喜歡貴方覺得表現出不包含此模型的觀點,那麼你可以隨時定義自定義事件處理程序,並觸發這是回調..

選項2

var customEvents = _.extend({}, Backbone.Events); 

this.save({ 
    myAnswer1: false 
}, { 
    success: function (model, response) { 
     answer = model.get('answer');   
     customEvents.trigger('notifyAnswer', { isAnswer : answer }); 
    } 
}); 

//在你想顯示

initialize: function() { 
    this.listenTo(customEvents, 'notifyAnswer', this.notify); 
}, 
notify: function(data) { 
    if(data.isAnswer) { 
      // Show something 
    } 
    else { 
     // show something else 
    } 
} 
2

model.save視圖返回的承諾。你可以捕捉它在你的getAnswer方法和觸發事件或者處理你的錯誤:

getAnswer: function() { 
    var self = this; 
    var p = this.model.save(); 

    p.done(function(data, status) { 
     answer = self.model.get('answer'); 

     if (answer === true) { 
      self.doTrueThing(); 
     } 
     else if (answer === false) { 
      self.doFalseThing(); 
     } 
    }); 
    p.fail(function() { 
     // failed :(
    }); 
}, 
1

是否有一個原因,爲什麼你不只是做:

getAnswer: function() { 
    this.model.save({myAnswer1 : false}, {success: function() { 
      ... 
      }.bind(this)}); 
}, 

在視圖本身,而不是使用在模型中定義的函數?

然後,您可以將成功處理程序綁定到視圖(使用.bind(this),如上),然後將成功處理程序中的視圖稱爲this。然後,您可以調用視圖中定義的任何功能來更新視圖,如this.updateMe()