backbone.js - 视图中的控制器属性

时间:2011-04-30 04:20:38

标签: javascript jquery backbone.js underscore.js

我有一个名为authenticated的控制器属性,默认为false。但是,在我的登录视图中,我需要能够将其设置为true。此外,在我的退出视图中,我需要能够将其设置为false。如何在视图中公开此属性?

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';
    }
    ...
});

1 个答案:

答案 0 :(得分:7)

您的控制器正在执行登录和注销功能。您需要做的就是让您的视图触发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并将应用程序事件冒泡到控制器。然后,控制器可以与服务器进行协调并管理任何必要的视图。