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

Ana*_*hka 5 dust.js dust-helpers

我将连接角色与灰尘模板ejs模板结合起来就像这种语法

<% if (userCan('impersonate')) { %>
  <button id="impersonate">Impersonate</button>
<% } %>  
Run Code Online (Sandbox Code Playgroud)

那是在玉

if userCan('impersonate')
  button#impersonate Impersonate
Run Code Online (Sandbox Code Playgroud)

怎么在灰尘中这样做?

            {@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}
Run Code Online (Sandbox Code Playgroud)

这段代码给我一个错误

Wed, 06 Jan 2016 16:57:47 GMT uncaughtException Expected end tag for assets but it was not found. At line : 42, column : 13
Run Code Online (Sandbox Code Playgroud)

编辑:我有这个 {@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                                                                                                                                                                                                                                                     ",
Run Code Online (Sandbox Code Playgroud)

这是我的控制者

    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
      });
    });
Run Code Online (Sandbox Code Playgroud)

var context 这里没用

Int*_*ang 4

尘埃不知道什么是功能。它只知道“引用”,这是您上下文中的关键。

如果上下文中的键是一个函数,Dust 将调用该函数并在其渲染中使用结果。此类函数称为上下文助手,您可以在文档中阅读有关它们的信息。或者,您可以直接使用 Dust 注册可在任何地方访问的函数——这些函数被称为全局助手

如果userCanconnect-roles 提供了某种可用的全局变量,您可以在全局帮助器中使用它,如下所示:

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

在你的模板中:

{@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}
Run Code Online (Sandbox Code Playgroud)

编辑:它看起来像是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}
Run Code Online (Sandbox Code Playgroud)

需要明确的是, Dust 中没有直接调用模板中函数的方法——它不支持任意 JS 执行。要调用带有参数的函数,您必须提供一个调用该函数的帮助器,以便它可以将参数转换为函数期望的格式。