Docpad:对扩展模板数据感到困惑

时间:2014-02-13 07:10:11

标签: docpad

我对将mongo数据添加到模板数据感到困惑。我甚至没有开始尝试从数据库中获取数据,因为我无法获取模板来查看测试数据(见下文)。目前这是在docpad.coffee中,但最终g将是mongoDB的输出。

events:

    extendTemplateData: (opts) ->
        # {templateData} = opts

        getGigsData: ->
            g = { "date" : "3-4-2013", "location" : "Gent" }
            return g

        opts.templateData["getGigsData"] = getGigsData

我希望通过<%= @getGigsData().date %>访问它 非常感谢您的指导

我应该补充一点,这个设计是基于想要让乐队轻松添加演出,而不让他们自己编辑页面内容,因为我担心他们会搞砸标记 - 如果有其他方法可以实现这一点目标,我很高兴听到。

1 个答案:

答案 0 :(得分:1)

在当地尝试过。并且遇到了问题:

debug: Emitting the event: extendTemplateData
    → [2014-02-14 01:38:50.030] [/Users/balupton/Projects/docpad-extras/skeletons/so-21747504/node_modules/docpad/out/lib/docpad.js:1184] [DocPad.emitSerial]
error: Something went wrong with the action
    → [2014-02-14 01:38:50.037] [/Users/balupton/Projects/docpad-extras/skeletons/so-21747504/node_modules/docpad/out/lib/interfaces/console.js:107] [ConsoleInterface.destroyWithError]
error: An error occured: 
ReferenceError: getGigsData is not defined
    at Object.docpadConfig.events.extendTemplateData (/Users/balupton/Projects/docpad-extras/skeletons/so-21747504/docpad.coffee:42:44)
    at ambi (/Users/balupton/Projects/docpad-extras/skeletons/so-21747504/node_modules/docpad/node_modules/ambi/out/lib/ambi.js:25:27)
    at DocPad.<anonymous> (/Users/balupton/Projects/docpad-extras/skeletons/so-21747504/node_modules/docpad/out/lib/docpad.js:995:25)
    at ambi (/Users/balupton/Projects/docpad-extras/skeletons/so-21747504/node_modules/docpad/node_modules/ambi/out/lib/ambi.js:23:18)
    at Task.<anonymous> (/Users/balupton/Projects/docpad-extras/skeletons/so-21747504/node_modules/docpad/node_modules/event-emitter-grouped/out/lib/event-emitter-grouped.js:45:23)
    at ambi (/Users/balupton/Projects/docpad-extras/skeletons/so-21747504/node_modules/docpad/node_modules/ambi/out/lib/ambi.js:23:18)
    at fire (/Users/balupton/Projects/docpad-extras/skeletons/so-21747504/node_modules/docpad/node_modules/taskgroup/out/lib/taskgroup.js:163:25)
    at b (domain.js:183:18)
    at Domain.run (domain.js:123:23)
    at Task.fire (/Users/balupton/Projects/docpad-extras/skeletons/so-21747504/node_modules/docpad/node_modules/taskgroup/out/lib/taskgroup.js:173:25)
    at processImmediate [as _immediateCallback] (timers.js:330:15)

这表明错误实际上在我们的事件处理程序中,而不是在我们的代码中。由于某些原因getGigsData没有设置,尽管我们:

    getGigsData: ->
        g = { "date" : "3-4-2013", "location" : "Gent" }
        return g

检查代码,作为CoffeeScript用户,我发现了这个问题。作为非coffeescript用户,您可以使用coffeescript网站http://coffeescript.org上的coffeescript编译器查看已编译的javascript,即:

({
  events: {
    extendTemplateData: function(opts) {
      ({
        getGigsData: function() {
          var g;
          g = {
            "date": "3-4-2013",
            "location": "Gent"
          };
          return g;
        }
      });
      return opts.templateData["getGigsData"] = getGigsData;
    }
  }
});

我们可以看到,这绝对不是我们所期望的。我们只是在一个对象中定义getGigsData,然后对它做任何事情。

问题是我们使用了冒号而不是等号,因此getGigsData: ->代替getGigsData = ->。这不是一个coffeescript的事情,但如果这也是javascript你会遇到同样的问题,虽然javascript可能会更明显,因为围绕对象定义必要的波浪形支撑。

作为旁注,如果您因任何原因喜欢使用带有DocPad的JavaScript,那么完全支持。您可以使用docpad.jsondocpad.js文件作为docpad配置文件。另一个选择是继续使用CoffeeScript,然后在反引号中包装JavaScript代码,请参阅:http://coffeescript.org/#embedded