2012-01-18 21 views
2

這可能更多的是圍繞設計模式的問題 - 我希望它是有道理的。視圖中的回調

我正在使用骨幹 - 我正在開發一個相對簡單的應用程序,用戶可以在其中添加請求(請求模型只是標題,說明和價格)。添加請求的唯一要求是用戶已「登錄」。

但是,我希望用戶在檢查用戶是否登錄(刪除一個屏障)之前'添加'請求。我的意思是說,用戶填寫表格,如果沒有註冊,他們必須註冊,然後請求被髮送,如果他們登錄,它只會被髮送。所以最初呈現'添加請求'視圖,當保存被觸發時,這將調用在服務器上調用ajax請求的模型上的保存。響應將返回true(用戶已登錄並添加了請求)或false(用戶未登錄)。

因此,假設用戶沒有登錄 - 那麼我希望呈現一個新的視圖'註冊',它有用戶切換到'登錄'(另一個視圖)的選項。所以,用戶在理論上可以從

Request (save) -> Register -> Login -> Request (save) 

去那麼假設該用戶隨後註冊(填寫表格,然後叫寄存器查看保存方法,然後叫寄存器模式保存並返回OK)。然後我想再次調用'請求'保存方法(因爲現在用戶會登錄)。然而,我不希望註冊/登錄綁定到請求視圖 - 理論上一個新的視圖(可以說我有一個發送的消息視圖)會想要類似的功能,例如嘗試提出請求,如果註冊失敗的交換機視圖 - 執行保存,然後調用一些回調。

所以問題是這樣做的正確方法是什麼?

1)我是否在引用'save'函數的請求視圖中創建了一些閉包,並將其存儲在全局變量中,並通過register/login onsuccess調用? 2)創建一個閉包如上,並將其傳遞給寄存器等(如果是的話,我怎麼會通過這個給定的註冊/登錄是一個視圖)。 3)通過引用請求視圖的'this'?

到目前爲止,我所擁有的只是在其他方面,我會呈現'註冊'視圖,但很想知道最好的方法來做到這一點,而不會變得非常醜陋?

save : function(event){ 
    if(this.model.isValid() == true) { 
     this.$("#general_error").hide(); 
     this.model.set({'formattedPrice' : TB_H.formatPrice(this.model.get('currency'), this.model.get('price'))}); 
     self = this; 
     this.model.save(this.model.toJSON(), { 
       success: function(m, y) { 
        if(y.status == true) { 
         self.model = new TB_BB.Request(); 
         Backbone.ModelBinding.bind(self);   
         Backbone.Validation.bind(self); 
         $('#add-offer-button').show(); 
        } else {        
         if(y.errors[0] == 'not logged in') { 
          this.$("#general_error").html('You are not logged in'); 
          this.$("#general_error").show();         
         } else {        
          _.each(y.errors, function(key, val) { this.$("#general_error").html(key) }); 
          this.$("#general_error").show(); 
         } 

        } 
       }, error : function(m,y) { 
        this.$("#general_error").show(); 
        this.$("#general_error").html("Something bad happened - please try again") 
       } 
      } 
     ); 

    } 

非常感謝您的幫助!

+0

你是如何完成這個工作的?我遇到了類似的事情 – bijanv

回答

0

我問了一個類似的問題,我剛剛刪除後,我注意到了這一點。我認爲這不是大多數人在骨幹網上做的方式。

我所做的是將不同的路由傳遞給同一個方法,如果id不爲null,我會調用路由。

所以,我有一個觀點

 
base_view = Backbone.Views.extend({ 
    initialize: function(id,a_id,b_id){ 
     this.id = id; 
     this.a_id = a_id; 
     this.b_id = b_id; 
     Myapp.data = new Myapp.Model.Base(); 
     Myapp.data.url = '/data_url/'+id; 
     Myapp.data.fetch(Myapp.data, { 
       success: function(response){ 
       // i have some nested collections, and models so i fill those in here 
       Myapp.mainModel = new First_Child_Collection(response.attributes.first_child_array); 
      }, error: function(){ 
       alert('oops couldn't get data'); 
      } 
    }); 
    Myapp.data.bind("fetched",this.render,this); 
}, 

    render: function(){ 
     new Main_View(); 
     new Sub_View_1(this.id); 
     new Sub_View_2(this.a_id); 
     new Sub_View_3(this.b_id); 
    } 
}); 

然後在我的路線,而不是爲每一個新的路線,我有

 
routes: { 
     "app/new": "new", 
     "app/:id/edit/a/:a_id/b/:b_id": "edit" 

} 

edit { 
    new base_view(id,a_id,b_id); 

} 

我不知道這是否是完美的,但我認爲它比其他選項乾燥。我只是在傳遞這些視圖之前檢查a_id或b_id是否未定義。

希望它有幫助。