Backbone JS中的动态模板加载

时间:2012-08-28 06:50:48

标签: jquery ruby-on-rails backbone.js underscore.js jst

在我目前的项目中,我正在使用ROR,Backbone,Underscore JS和JQuery。在其中一个视图中,我将JST模板设置如下

ABC.Views.BoardView = Backbone.View.extend({

    template : changeBoard,

    // el: '#boardHolder',

    events : {
        'click .count' : 'showPlaced',
        'click #newCard' : 'newCardForm',
        'click #showCardsOverview' : 'showCardsOverview'
    },

它继续......

此外,我在页面底部有一个功能如下

changeBoard: function(){
        var params = window.location.search.replace( "?", "" );
        var param= params.split("=");
        var boardSize = param[1];
        //return boardSize;
        if(boardSize === 4){
            'analysis/board44'
        }else{
            'analysis/board'
        }
    }

为什么我写这个函数是为了从URL获取参数而加载不同的JST模板。但这种方式对我不起作用。它给我以下错误

ReferenceError: changeBoard is not defined
[Break On This Error]   

template : changeBoard,

有没有人知道如何通过获取URL参数来加载动态JST模板

由于

2 个答案:

答案 0 :(得分:1)

检查此示例: template:null,

    events: {
    },
    initialize: function () {
        if (changeTemplate) {
            this.template = "#PublicationGroupStatTemplate";
            changeTemplate = false;
        } else {
            this.template = "#PublicationGroupReportTemplate";
        }

但是,您可以在函数.. this.changeboard中的if语句中执行相同操作。代码将类似于:initialize:this.changeboard。 希望能帮助到你。不要太晚!!

答案 1 :(得分:0)

Ruby和Javascript之间存在一些语法问题:

template: changeBoard,

以上指向名称为changeBoard的变量。稍后在您的视图中定义一个名为changeBoard的函数。这与通过functionName()调用函数的Javascript不同。我可以理解这种混淆,因为Ruby有可选的括号,而Javascript在调用函数时需要括号。

此外:

if(boardSize === 4){
  'analysis/board44'
}else{
  'analysis/board'
}

上面的函数将返回undefined,因为没有给出return关键字。同样,这是Javascript而不是Ruby:)

你想要的是:

changeBoard: function(){
  var params = window.location.search.replace( "?", "" );
  var param= params.split("=");
  var boardSize = param[1];
  //return boardSize;
  if(boardSize === 4){
    return 'analysis/board44';
  } else {
    return 'analysis/board';
  }
}

最好在视图的初始化功能中设置动态模板:

ABC.Views.BoardView = Backbone.View.extend({

  initialise: function(){
    this.template = this.changeBoard();
  }
});

如果boardSize一直在变化,那么应该在渲染之前设置模板:

ABC.Views.BoardView = Backbone.View.extend({

  render: function(){
    this.template = this.changeBoard();
    //render code continues here
  }
});

HTH,祝你好运:)