【问题标题】:Docpad: confused about extending template dataDocpad:对扩展模板数据感到困惑
【发布时间】:2014-02-13 22:44:32
【问题描述】:

我对将 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 %> 访问它 非常感谢您的指导

我应该补充一点,这个设计是基于希望让乐队更容易添加演出,而不是让他们编辑页面内容本身,因为我担心他们会弄乱标记 - 如果有其他方法可以实现这一点目标,我很高兴听到。

【问题讨论】:

    标签: docpad


    【解决方案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: -&gt; 而不是getGigsData = -&gt;。这不是咖啡脚本的事情,但如果这也是 javascript,你也会遇到同样的问题,尽管由于对象定义周围有必要的波浪形大括号,javascript 可能更明显。

    作为旁注,如果您出于某种原因更喜欢将 JavaScript 与 DocPad 一起使用,则完全支持。您可以为您的 docpad 配置文件使用 docpad.jsondocpad.js 文件。另一种选择是继续使用 CoffeeScript,然后将 JavaScript 代码包装在反引号中,请参阅:http://coffeescript.org/#embedded

    【讨论】:

    • 固定的第 1 阶段,但我仍然卡在猫鼬部分 [github.com/simonh1000/docpad-plugin-mongo/blob/master/src/…。它发现它是因为 console.dir 命令看起来不错,但我不确定如何连接到 docpad - 目前您看到一组嵌套的 return 命令,但这不起作用。我第一次尝试将opts 传递给 getGigsData 似乎并没有改善情况。我尝试按照示例代码进行操作,但无济于事
    • 您能否将其作为一个单独的问题提出来,我很乐意跟进。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 2011-06-10
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 2013-05-09
    相关资源
    最近更新 更多