2016-01-26 3 views
1

Я динамически стимулирующий шаблон для изменения событий/или массивов (с функцией наблюдения).Blaze Meteor динамически instanciate шаблон и datacontext

Для достижения этой цели я использую

//whatever event you want, eg: 
$(".foo").on("click", function(){ 
    Blaze.renderWithData(Template.widgetCard, d, $(".cards").get(0)); 
} 

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

Потому что я только что оказал этот шаблон на div.cards я не могу использовать Template.parentData(1), чтобы получить родительское DataContext, даже так это div.cards является включить в шаблон.

Быстрое исправление будет заключаться в том, чтобы установить нужный ссылочный объект (который в моем случае является объектом) переменной datacontext переменной parent в глобальную область или даже использовать сеанс или напрямую передать этот контекст через данные renderWithData.

Знаете ли вы какой-либо другой способ, даже лучше правильный (я имею в виду Метеор фантазии), чтобы достичь этого? Хорошо ли Blaze.renderWithData прецедент?

Сообщите мне, если я неясен или нужен еще код.

EDIT:

Дополнительная информация контекст:

Я диаграммы (d3), где можно выбрать несколько частей. У него есть свойство массива для хранения этой выбранной части данных.

Chart = function Chart(clickCb, hoverCb, leaveCb, addSelectionCb, removeSelectionCb){ 
    var chart = this; 
    chart.selectedParts = []; 
    //... code 
} 

С внешней стороны этой диаграммы класса (так на стороне клиента Метеор), то chart.selectedParts модифицируется (добавить/удалить).

сон будет «связывать» этот массив chart.selectedParts как:

Template.templateContainingAllThoseCards.helpers({ 
    selectedDataChart: function(){ 
     return Template.instance.chart.selectedParts; 
    }, 
    //... 
}); 

и на шаблоне быть в состоянии сделать что-то вроде этого:

<div class="row"> 
    <div class="large-12 columns"> 
     <div class="cards"> 
      {{#each selectedDataChart}}    
       {{> cardWidget}} 
      {{/each}} 
     </div> 
    </div> 
</div> 

Как и что, если chart.selectedParts был реактивный, Blaze может автоматически создать или удалить cardWidget экземпляр шаблона из-за привязки.

Я пытался использовать на нем пакет manuel:reactivearray (и это своего рода анонимная причина. Я делаю сложные манипуляции с этим массивом с помощью Underscore, который, очевидно, не работает с не-родным типом массива, таким как reactiveArray). Не работает, но я не знаю, должно ли оно работать.

Как вы думаете?

В это время я делаю вещи немного грязно, я полагаю; I juste instanciate/destroying Blaze View на элемент добавлен/удален chart.selectedParts as: Blaze.renderWithData(Template.widgetCard, {data: d, chart: this}, $(".cards").get(0));

+0

Я чувствую, что требуется больше кода. В моей голове я чувствую, что это будет случай, когда вы хотите, чтобы реактивный var активировал onClick, чтобы сделать загрузку шаблона widgetCard ... –

+0

Да, я уверен, что реактивный вар должен быть хорошим, но все мало бит более сложный. Я отредактирую вопрос более подробно, чтобы показать вам. –

ответ

0

Так вот, как мне это удается.

На самом деле я не думаю, что использование Blaze.renderWithData() - хорошее решение.

Лучший способ, который я нашел, - передать ваши данные в «Реактивный режим», чтобы иметь возможность использовать все функциональные возможности Template и продолжать использовать Spacebars для создания шаблонов. (Как родительская ссылка DataContext).

Самый простой способ иметь реактивный источник данных всегда соответствовать вашим данным с вашим Mongo, поэтому мне не нужно объявлять пользовательский источник Reactive Data (который может быть сложным из сложного из сложной структуры данных js).

Если у кого-то такая же проблема, я уверен, что это потому, что вы не следуете «хорошему» способу делать (что было моим делом).

Один кон, всегда обновляющий вашу БД как реактивный. Источником данных должен быть случай, когда вы выполняете много изменений состояния пользовательского интерфейса, и в конце концов, сохраняете изменение. В этом случае, очень бесполезно всегда проходить через БД, но это далеко от самого быстрого решения.

Спросите меня, есть ли у вас какие-либо проблемы в понимании философии/способа сделать, я начинаю понимать, что я делаю!