函数调用和检查结果在DustJs中

时间:2016-01-06 17:01:21

标签: dust.js dust-helpers

我将连接角色与灰尘模板相结合 ejs模板有类似这样的语法

<% if (userCan('impersonate')) { %>
  <button id="impersonate">Impersonate</button>
<% } %>  

和那个在玉器中

if userCan('impersonate')
  button#impersonate Impersonate

如何在尘土中做到这一点?

            {@eq key=userCan('edit data') value="true" }
                <td><a href='/assets/edit/{.ID_ASSET}'>Edit</a></td>
                <td><a href='/assets/delete/{.ID_ASSET}'>Delete</a></td>
            {:else}

            {/eq}

此代码给我一个错误

Wed, 06 Jan 2016 16:57:47 GMT uncaughtException Expected end tag for assets but it was not found. At line : 42, column : 13

编辑: 我在{@contextDump key="full"/}

中有这个
   "tail": {},
  "isObject": true,
  "head": {
    "enrouten": {
      "routes": {},
      "path": "function path(name, data) {var route;route = this.routes[name];if (typeof route === 'string') {return path2regexp.compile(route)(data);}return undefined;}"
    },
    "userIs": "function (action) {var act = ert(req, action);return roles.test(req, act)}",
    "userCan": "function (action) {var act = ert(req, action);return roles.test(req, act)}",
    "isAuthenticated": "function () { [native code] }",
    "_csrf": "FSaqN0PWxOF4slTUfnGHXJ0NkPOTJFl0u57eM=",
    "title": "Справочник спецификаций",
    "assets": [
      {
        "ID_ASSET": 1,
        "SYMBOL_KODE": "12.TR.18",
        "DOK_NAME": "ТХ9042",
        "DESCRIPTION": "Контроллер программируемый ТХ9042",
        "DATE_RELISE": "2001-10-04T21:00:00.000Z",
        "POS_KODE": "pos kode 1                                                                                                                                                                                                                                                     ",

这是我的控制器

    router.get('/',  function (req, res) {
   var context = {
   req: req, // from Express callback
   userCan: function(chunk, context, bodies, params) {
     var permission = context.resolve(params.permission);
     return context.get('req').userCan(permission);
   }
 }
    models.SPR_ASSET.findAll({
      include: [ models.SPR_TYPE_UM, models.SPR_TYPE_ASSETS,  models.SPR_ASSETS_DS ]
    }).then(function(assets) {
      res.render('assets', {
        title: 'Справочник спецификаций',
        assets: assets
        context: context
      });
    });

var context这里没有工作

1 个答案:

答案 0 :(得分:4)

尘埃并不知道什么是功能。它只知道&#34;引用&#34;,它们是你上下文中的键。

如果上下文中的键是一个函数,Dust将调用该函数并在其渲染中使用结果。这些函数称为上下文帮助程序,您可以阅读它们in the documentation。或者,您可以直接在Dust注册函数,这些函数可以在任何地方访问 - 这些函数称为全局帮助程序

如果userCan是某种连接角色可用的全局,您可以在这样的全局帮助器中使用它:

dust.helpers.userCan = function(chunk, context, bodies, params) {
  var permission = context.resolve(params.permission);
  return userCan(permission);
}

在你的模板中:

{@userCan permission="edit data"}
  <td><a href='/assets/edit/{.ID_ASSET}'>Edit</a></td>
  <td><a href='/assets/delete/{.ID_ASSET}'>Delete</a></td>
{:else}
  Please log in.
{/userCan}

编辑:看起来userCan是请求范围的,因此您可以通过将请求变量添加到您的上下文来使用它。类似的东西:

var context = {
  req: req, // from Express callback
  userCan: function(chunk, context, bodies, params) {
    var permission = context.resolve(params.permission);
    return context.get('req').userCan(permission);
  }
}

{#userCan permission="edit data"}
  <td><a href='/assets/edit/{.ID_ASSET}'>Edit</a></td>
  <td><a href='/assets/delete/{.ID_ASSET}'>Delete</a></td>
{:else}
  Please log in.
{/userCan}

要清楚,在Dust中直接在模板中调用函数有 no 方法 - 它不支持任意JS执行。要调用带参数的函数,必须提供一个调用函数的帮助器,以便它可以将参数转换为函数所期望的格式。