2016-09-10 5 views
0

У меня странная проблема с контекстами Dust.js. Раньше я передавал модель представления в виде обычного старого объекта JavaScript, например. res.render('page', { something: [1,2,3] } и т.д. При выполнении этого, я мог бы получить доступ к something на локальном контексте с {#something}...{/something} и т.д.Почему префикс stack.head необходим для доступа к локальному контексту в Dust.js?

Однако, я изменил способ, я управляю контекстом использовать dust.makeBase, так что я могу иметь глобал и какое-то стек, а чем просто объект. Я использую consolidate с express FWIW.

Теперь я создаю baseViewModel.

// 
// at application init 
// 
app.baseViewModel = dust.makeBase({ 
    someGlobal: 'example' 
}) 

Позже, при рендеринге, я могу продлить его следующим образом:

// 
// in route handler 
// 
const viewModel = app.baseViewModel.push({ 
    collection: someCollection 
}) 

res.render('index', viewModel) 

Но тогда, стек контекста выглядит следующим образом:

{ 
    "settings": { 
    // snip 
    }, 
    "stack": { 
    "isObject": true, 
    "head": { 
     "collection": [ 
     // snip 
     ] 
    } 
    }, 
    "global": { 
    "someGlobal": "example" 
    } 
} 

Проблема заключается в том, в настоящее время, для доступа к коллекции, я должен префикс переменных с stack.head.:

{#stack.head.collection} 
    <!-- etc --> 
{/stack.head.collection} 

Кто-нибудь знает, почему это так, и как я могу вернуться к простому способу просто ссылаться на {#collection} и т. Д.?

спасибо.

ответ

0

Мне удалось получить эту работу, но это взломать, и это должно быть сделано таким образом. Существует билет GitHub сейчас для этого выпуска:

https://github.com/linkedin/dustjs/issues/743

Во всяком случае, это то, что я сделал:

dust.helpers.collection = (chunk, context, bodies, params) => { 
    return context.current().get('collection') 
} 

А затем изменил мою разметку:

{@collection} 
    {.Name} etc 
{/collection} 

Странно, но я думаю, что так оно и работает!

+0

Вам не нужно ничего делать - 'head' - это просто внутреннее представление стека контекста, и пыль будет пересекать его изначально для вас. – Interrobang

+0

https://jsfiddle.net/xb3u2s84/ базовый пример – Interrobang

+0

Я понимаю это, но он не работает. Как только я отошел от POJO к объекту контекста пыли (для глобалов), я потерял способность сделать это. Любая идея, почему это может быть? Я думаю, что это может иметь какое-то отношение к «консолидации». –

0

Согласно нашей цепочке комментариев, я подозреваю, что это проблема.

Когда вы создаете новый объект Context в Dust, это checks to see if you're passing in an existing Context to hydrate from. Это делается с помощью проверки instanceof.

Если объект не является экземпляром контекста, он завершается в новый контекст, который учитывает поведение, которое вы видите здесь. Это не здорово, поэтому я буду работать над PR, чтобы использовать флаг вместо отметки instanceof.

Вы используете консолидацию, которая включает в себя зависимость от пыли, и я подозреваю, что версия, которую она включает, отличается от того, на что вы зависите в своем пакете. Json. Я бы посмотрел, сколько копий dustjs-linkedin находится в вашем дереве (возможно, один из ваших корней и один в node_modules консолидации). Если вам требуется dustjs-helpers, просто требуется dustjs-linkedin, так что последнее - это то, что вам действительно нужно.

+0

Только что видел этот ответ. Был сосредоточен на цепочке комментариев выше. В соответствии с этим я создал проблему GH на https://github.com/linkedin/dustjs/issues/743 со всей необходимой информацией. Еще раз, спасибо за помощь. Оценил. FWIW, переехал в Хоффман с такими же результатами. –