2016-04-28 14 views
0

ich einen Dust.js Helfer haben, wo ich einige acl Logik gelten wie folgt:Dust.js Vorlage Benutzerdefinierte Helper in Bootstrap inkonsistentes Verhalten

'use strict'; 

import dust from 'dustjs-linkedin'; 
import acl from '../config/acl'; 

dust.helpers.accessControl = function(chunk, context, bodies, params) { 
    let userId = params.userId; 
    let resource = params.resource; 
    let permission = params.permission; 

    acl.acl.isAllowed(userId, resource, permission, function(err, res){ 

     if(res){ 
      chunk.render(bodies.block, context); 
      return chunk; 
     } 
     else { 
      return chunk; 
     } 
    }); 
}; 

In der Vorlage:

{@accessControl userId=user._id resource="/admin" permission="get"} 
        <li class="nav-item"> 
         <a class="nav-link" ng-class="{'active' : getPath()[0] == 'admin'}" href="/admin">Admin</a> 
        </li> 
       {/accessControl} 

Die Helfer bekommt korrekt mit korrekten Parametern aufgerufen, und node_acl autorisiert den Benutzer korrekt (res im Rückruf ist true). An vielen Stellen in meinen Vorlagen, zeigt es das gewünschte Verhalten, mit Ausnahme des Bootstrap 3 navbar, wo es in der Regel nichts macht, und manchmal unterhalb der ul in der Navigationsleiste:

Below the navbar

Irgendwelche Gedanken? Beachten Sie, dass ich Angular verwende, um eine aktive Klasse in die Links einzufügen. Es ist kein SPA und Deep Linking ist deaktiviert, aber es sollte nichts zu tun haben, da die Templates auf der Serverseite gerendert werden. Vielen Dank!

Antwort

0

node_acl Anfragen sind asynchron. Ich musste meinen Helfer zu:

dust.helpers.accessControl = function(chunk, context, bodies, params) { 
    let userId = params.userId; 
    let resource = params.resource; 
    let permission = params.permission; 

    return chunk.map(function(chunk) { 
     acl.acl.isAllowed(userId, _reverse(resource), permission, function(err, res){ 
      if(res && bodies['block']) { 
       return chunk.render(bodies['block'], context).end(); 
      } 
      else { 
       return chunk; 
      } 
     }); 
    }); 
}; 

ändern, um Out-of-Order-Chunks zu überwinden.