1

在我目前的项目中,我正在使用 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 模板

谢谢

4

2 回答 2

1

检查此示例:模板:空,

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

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

于 2013-01-22T10:12:28.797 回答
0

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

template: changeBoard,

上面指向一个名为 changeBoard 的变量。稍后在您的视图中,您定义了一个名为 changeBoard 的函数。这与在 Javascript 中通过 functionName() 调用函数不同。我可以理解这种混淆,因为 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,祝你好运:)

于 2013-01-22T11:05:20.987 回答