Вызов функции и проверка результатов в DustJs

Я объединяю Connect-роли с шаблоном 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 ответ

Пыль не знает, что это за функции. Он знает только о "ссылках", которые являются ключами в вашем контексте.

Если ключ в вашем контексте является функцией, Dust вызовет функцию и будет использовать результат при ее рендеринге. Такие функции называются контекстными помощниками, и вы можете прочитать о них в документации. Кроме того, вы можете зарегистрировать функции непосредственно в Dust, которые доступны где угодно - они называются глобальными помощниками.

Если userCan это какой-то глобальный тип, доступный через connect-role, вы можете использовать его в качестве глобального помощника:

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 нет метода для вызова функции непосредственно в вашем шаблоне - он не поддерживает произвольное выполнение JS. Чтобы вызвать функцию с параметрами, вы должны предоставить помощника, который вызывает функцию, чтобы она могла преобразовать параметры в формат, ожидаемый вашей функцией.

Другие вопросы по тегам