BackboneJS中的this.currentView未定义

this.currentView in BackboneJS is undefined

本文关键字:未定义 currentView this 中的 BackboneJS      更新时间:2023-09-26

我在Backbone.js的主视图中渲染子视图为了杀死zoombie视图,我创建了一个公共函数:

function showView(view) {
  if (view){
    view.remove();
  }
  this.currentView = view;
  this.currentView.render();
  $("#column").html(this.currentView.el);
}

这里我称showView():

 render : function(){
        this.$el.html(mainTemplate);
        var _subview= new SubView({el : '#column'});
        showView(_subview);
 }

子视图:

define(["jquery" ,
"underscore" ,
"backbone",
"text!templates/subviewTemplate.html"
],function($, _, Backbone, Subview){
 var SubView= Backbone.View.extend({
    initialize : function(){
    },
    render: function(){
        var _subview= _.template(Subview);
        this.$el.html(_subview());
        return this;
    }
 });
 return SubView;
});

问题:当我在当前视图或showView()中执行console.log(this.currentView)时,结果未定义。

知道是什么原因造成的吗?

有两件事:首先,下划线的_.template函数,除非您同时向它传递模板和一些数据,否则它将返回另一个函数。现在看来,您只是在向它传递模板字符串。您要么需要额外传递数据进行插值:

var _subview = _.template(Subview, { key: value });

或者,如果没有要插入的数据,则需要调用该方法来返回标记字符串:

$(this.el).html(_subview());

如果要将视图附加到现有图元,我建议您不要使用此选项$el.当你要求它附加到的元素还不在DOM中时,这个$el将是未定义的。您仍然可以使用$(this.el),而不是使用这种简写,因为在元素存在于DOM中之前,它不会尝试将el选择并缓存为jquery封装的对象。另一种选择是允许div创建元素,并将整个el附加到DOM中,在这种情况下可以使用它$el。