Javascript 主干模型更改和视图渲染更新

Javascript 主干模型更改和视图渲染更新,javascript,node.js,backbone.js,express,requirejs,Javascript,Node.js,Backbone.js,Express,Requirejs,我有一个在后端带有会话的express应用程序,在前端我有主干+RequireJS。我的问题在于我拥有的会话模型,以及触发视图上呈现方法的更改事件 因此: 该应用程序有一个主视图,它有一个会话模型“更改”事件的侦听器,并运行“render”方法 没有凭据的用户从主页进入公共页面,比如to/about 其中,用户从具有登录表单(用户/密码)的标题登录 由于第1项中的侦听器,container元素获得了一个更新的主内容,但用户仍然在/about中 因此,问题是:如何避免这种不良行为,使视图只在正确的

我有一个在后端带有会话的express应用程序,在前端我有主干+RequireJS。我的问题在于我拥有的会话模型,以及触发视图上呈现方法的更改事件

因此:

  • 该应用程序有一个主视图,它有一个会话模型“更改”事件的侦听器,并运行“render”方法
  • 没有凭据的用户从主页进入公共页面,比如to/about
  • 其中,用户从具有登录表单(用户/密码)的标题登录
  • 由于第1项中的侦听器,container元素获得了一个更新的主内容,但用户仍然在/about中
  • 因此,问题是:如何避免这种不良行为,使视图只在正确的路由处于活动状态时才侦听事件

    代码示例:

    "use strict";
    
    var SessionModel = Backbone.Model.extend({});
    
    var sessionModel = new SessionModel();
    
    var HomeView = Backbone.View.extend({
        initialize: function() {
            this.listenTo(sessionModel, "change", this.render);
        },
        render: function() {
            // updates the main container element
        }
    });
    
    var AppRouter = Backbone.Router.extend({
        "": "home",
        "about": "about"
    });
    
    var appRouter = new AppRouter();
    
    appRouter.on("route", function() {
        sessionModel.fetch(); // Updates session model on every route change
    });
    
    appRouter.on("route:home", function() {
        var homeView = new HomeView();
        homeView.render();
    });
    

    您可以侦听expecific属性,而不是侦听各种更改

    this.bind("change:SomeExpecificThing", doEspecificThing)
    

    我找到了解决问题的方法:

    sessionModel.on("change", function () {
        Backbone.history.loadUrl();
    }).fetch();
    

    这样,我们就触发了正确的路由,并在不向视图中添加侦听器的情况下再次渲染。

    问题是否真的在于
    /about
    上的用户,但是
    HomeView
    仍然存在?通常,当从
    /
    切换到
    /about
    时,您会破坏旧视图并抛出一个新视图。您能解释一下为什么需要在特定视图中收听
    会话模型的更改吗?它不应该在
    路由器
    初始化
    函数中。我将尝试销毁解决方案,因为我需要sessionModel随时存在。在当前结构中,更改仍然会触发HomeView的“render”方法,并替换主容器的内容。问题不在于属性的变化,而在于事件侦听器。