Jade无法访问变量,除非它呈现为{{variable}}

时间:2013-09-02 21:44:23

标签: javascript backbone.js pug

我正在使用_.template从Backbone.js传递值后呈现Jade模板。我可以直接访问任何呈现的内容:

// Jade
{{ variable }}

但我无法使用以下方式访问它:

// Jade
each item in variable
// exception: variable is not defined

因此,例如在下面的代码中,我试图发送一个资源对象,我可以使用每个迭代,但我似乎无法访问它,除非它被标记为{{resources}},但是然后我似乎无法用Jade中的每一个迭代它。

Backbone.js的:

render: function() {
  this.$el.append( this.todoTpl({
      // data
      resources: this.collection.data.attributes.resources,
    })
  );

  return this;

}

if(typeof resources !== "undefined")
      each key, value in resources
        div.dev
          p= value
          p= key

从不显示任何内容。 如果我使用{{resources}},我可以将[Object,Object]呈现给HTML。

我已经尝试过使用locals.resources等等,但我似乎无法解决这个问题,看起来它应该是愚蠢和简单的东西。

TL; DR:如何设置变量以便Jade方法可以访问它,而不是仅仅{{variable}}呈现为文本?

谢谢!

更新 为我的收藏发布其他代码:

var ProjectDataCollection = Backbone.Collection.extend({

  defaults: {
    versionOne: "",
    eCM: "",
    bugzilla: "",
    teamCity: "",
    appData: "",
    data: "",
  },

  model: ProjectModel,

  url: '/data',

  initialize: function(models, options) {
      var id = options.id || [];
      if (id > 0) { 
          this.fetchData(id);
      }
      console.log("A new collection has been created.");
  },

  fetchData: function(id) {
    // Save a reference to the existing url
    var baseUrl = this.url;

    // Assign our batch url to the 'url' property and call the server
    this.url += '/' + id;
    this.fetch({
        success: function(collection, response) {
            collection.appData = new AppData(response.details);
            collection.bugzilla = new Bugzilla(response.apis.bugzilla);
            collection.versionone = new VersionOne(response.apis.versionone);
            collection.trigger('change');
        },
        error: function() {
            console.log("fail");
        }
    });

    // Restore the 'url' property
    this.url = baseUrl;
}

});

我避免发布所有这些,主要是为了让我的问题变得简单。如果我离开太多,我道歉!由于我对Backbone缺乏经验,我也知道我在这里做了一些可怕的事情:)

更新分辨率:

回答几个问题:我正在使用Jade和Underscore,因为用于HTML的Jade模板非常简洁。 Backbone使用Underscore将数据传递到我用Jade渲染的JS模板中。虽然我没有看到很多人在网上这样做,但有一些帖子,其他人更喜欢这种安排。

user1737909的评论帮助我找到了解决方案。当使用_.template时,我将覆盖传递给templateSettings全局,以便使用{{}}进行插值(从我使用过的另一个模板引擎中保留)。 Underscore将以这种方式打印出直接值,但它不会处理脚本,例如:

{{ _.each(list, function() {} }}

删除覆盖设置后:

<% _.each(list, function() {} %>

很开心,工作得很完美。虽然使用两个模板引擎似乎很奇怪,我不得不说Jade非常好,但仍然值得欣赏它的语法:)

感谢您的反馈!

1 个答案:

答案 0 :(得分:1)

玉插值是#{var},而不是{{ var }},所以我猜你不是把你的变量传递给Jade而是传递给别的东西(比如把手甚至角或其他东西)