2016-01-06 9 views
5

Я комбинируя Connect-роли с шаблоном пыли шаблон EJS есть что-то вроде этого синтаксисаВызов функции и проверки результатов в DustJs

<% 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 

Edit: У меня есть это в {@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 здесь не работает

ответ

4

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

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

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

+0

У меня есть userCan func в моем объекте req в контроллере, но я не видел его ни в одном параметре в помощнике пыли, просто я не могу вызвать req.userCan («что-то») из шаблона пыли –

+0

Если 'userCan' является request-scoped, вам нужно будет написать хелпер контекста и передать объект запроса в ваш контекст. – Interrobang

+0

Этот контекст var должен быть в маршрутизаторе? и передать его для просмотра? затем (функция (активы) { res.render ('assets', { title: 'Title', context: context }); }); Это не сработало.И я не могу получить req in view –