0

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

// Jade
{{ variable }}

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

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

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

骨干.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 全局以利用 {{ }} 进行插值(我使用过的另一个模板引擎的保留)。下划线将以这种方式打印出直接值,但它不会处理脚本,例如:

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

一旦我删除了我的覆盖设置:

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

很高兴并且工作完美。虽然使用两个模板引擎似乎很奇怪,但我不得不说 Jade 非常好,享受它的语法仍然值得:)

感谢您的反馈!

4

1 回答 1

1

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

于 2013-09-02T21:56:32.560 回答