【问题标题】:How to use Templates with Backbone.js for Chrome Extension in Manifest Version 2如何在清单版本 2 中将模板与 Backbone.js 一起用于 Chrome 扩展
【发布时间】:2012-07-02 18:02:25
【问题描述】:

我正在尝试为我的主干视图使用模板。我尝试使用 underscore.template 让它运行。问题在于,由于 chrome 扩展的 manifest_version 2 存在一些安全限制。我认为原因是因为不再允许内联块。在这个小例子中,我加载了一个模板并尝试渲染它。然后我得到错误:

未捕获的错误:此上下文不允许从字符串生成代码。

我也在我的 html 文件中使用 Handlebars.js 和一个模板进行了尝试。它在普通的浏览器窗口中工作。但它不作为 chrome 扩展。

那么如何在带有 manifest_version 2 的 chrome 扩展中使用带有主干.js 的模板?

带下划线(不起作用):

define [
  'jquery'
  'backbone'
  'lib/facade'
  'text!templates/loginTemplate.js'
],
($, Backbone, facade, LoginTemplate) ->
  'use strict'
  class LoginView extends Backbone.View
    tagName: 'div'
    events: {

    }

    initialize: (options) ->
      @el = options.el

    render: ->
      console.log 'LoginView: render()'
      $(@el).html(_.template(LoginTemplate, {}))

带车把(不工作):

index.html 中的模板:

<!-- templates -->
  <script id="loginTemplate" type="text/x-handlebars-template">
    <form class="form-horizontal">
      <fieldset>
        <legend>Login</legend>
        <div class="control-group">
          <label class="control-label" for="email">Email:</label>
          <div class="controls">
            <input type="text" class="input-xlarge" id="email" name="email">
          </div>
        </div>
        <div class="control-group">
          <label class="control-label" for="password">Passwort:</label>
          <div class="controls">
            <input type="password" class="input-xlarge" id="password" name="password">
          </div>
        </div>
        <div class="form-actions">
          <button type="submit" class="btn btn-primary">Login</button>
        </div>
      </fieldset>
    </form>
  </script>

在我看来:

define [
  'jquery'
  'backbone'
  'lib/facade'
],
($, Backbone, facade) ->
  'use strict'
  class LoginView extends Backbone.View
    tagName: 'div'    
    events: {

    }

    initialize: (options) ->
      @el = options.el

    render: ->
      console.log 'LoginView: render()', $("#loginTemplate")
      $(@el).html(Handlebars.compile($("#loginTemplate").html()))

【问题讨论】:

    标签: javascript google-chrome backbone.js google-chrome-extension handlebars.js


    【解决方案1】:

    Underscore 和 Handlebars 模板都将字符串转换为 JavaScript 函数;例如Underscore does it like this:

    source = "var __t,__p='',__j=Array.prototype.join," +
      "print=function(){__p+=__j.call(arguments,'')};\n" +
      source + "return __p;\n";
    
    var render = new Function(settings.variable || 'obj', '_', source);
    

    所以它构建了一些 JavaScript 并使用 new Function 构建一个函数;车把可能会做类似的事情。显然 Chrome 不希望你在扩展程序中做这样的事情。

    您可以预编译模板,然后将该函数作为一段简单的 JavaScript 嵌入到您的扩展中。对于下划线模板,您可以look at the source property:

    source 属性在编译后的模板函数中可用,以便于预编译。

    <script>
      JST.project = <%= _.template(jstText).source %>;
    </script>
    

    因此您可以在打包扩展程序时 t = _.template(your_template) 并将 t.source 文本作为 JavaScript 函数放入您的扩展程序中。

    您可以使用 Handlebars 做类似的事情(例如,参见 handlebars_assets)。

    它们都使您的构建和打包过程复杂化,但如果 Chrome 不希望您在扩展程序中构建功能,那么您无能为力。

    【讨论】:

    • 但这意味着我不能,例如从服务器获取集合的数据,然后在运行时动态构建集合视图?编辑:好的,现在我明白了。 =)
    猜你喜欢
    • 2012-08-02
    • 2012-08-02
    • 2020-11-28
    • 1970-01-01
    • 2012-09-03
    • 2021-09-16
    • 2012-08-04
    • 2021-11-28
    相关资源
    最近更新 更多