2011-04-30 106 views
6

我有一個名爲authenticated的控制器屬性,其默認值爲false。但是,在我的登錄視圖中,我需要能夠將其設置爲true。另外,在我的註銷視圖中,我需要能夠將其設置爲false。如何在視圖中公開此屬性?backbone.js - 視圖中的控制器屬性

var Controller = Backbone.Controller.extend({ 
    ... 
    authenticated: false, 

    login: function() { 
     if(this.authenticated) 
     { 
      location.hash = '!/dashboard'; 
     } else { 
      new LoginView(); 
     } 
    }, 

    logout: function() { 
     $.post('/admin/logout', {}, 
     function(resp){ 
     }, "json"); 

     this.authenticated = false; 
     location.hash = '!/login'; 
    } 
    ... 
}); 

回答

7

您的控制器正確地執行登錄和註銷功能。所有你需要做的是讓你的視圖fire backbone.js事件,並讓控制器註冊來接收這些事件。

在您的控制器

某處,你需要的東西,如:

var loginView = new LoginView(...); // params as needed 
loginView.bind("login_view:login", this.login); 
loginView.bind("login_view:logout", this.logout); 
loginView.render(); 

此外,您還需要確保控制器設置爲處理事件,因此需要在你的初始化函數是這樣的:

_.extend(this, Backbone.Events); 
_.bindAll(this, "login", "logout"); 

您的視圖將需要事件代碼,因此請務必將_.extend(...)調用添加到其初始化中。

您認爲在適當情況下,你需要:

this.trigger("login_view:login"); 

this.trigger("login_view:logout"); 

最後一點,讓控制器做登錄和註銷服務器調用。您從視圖中需要的只是一個事件並且可能是人口稠密的模型或數據。該數據將作爲觸發語句中的參數傳遞,並將作爲登錄/註銷功能中的參數接收。但是,我沒有在代碼中包括這個。

您基本上想要視圖來管理DOM並將應用程序事件向控制器冒泡。然後控制器可以與服務器進行調解並管理任何必要的視圖。