我正在动态实例化事件/或数组更改的模板(具有类似观察的功能)。

为此,我使用

//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包含在模板中也是如此。

快速的解决方法是在全局范围内设置想要的引用(在我的情况下是一个对象)变量parent的datacontext,甚至使用Session,或者直接通过renderWithData的数据传递此上下文。

您是否知道其他方法,甚至更好的适当方法(我的意思是流星幻想方法)来实现这一目标?
这是一个很好的Blaze.renderWithData用例吗?

告诉我是否不清楚或需要更多代码。

编辑:

补充上下文信息:

我有一个图表(d3),可以在其中选择某些部分。
它具有一个数组属性来存储此选定的数据部分。

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


在此Chart类之外(例如在Meteor客户端),修改了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在此数组上执行复杂的操作,这显然不适用于非本机数组类型,例如reactArray)。
不起作用,但是我不知道它是否应该起作用。

你怎么看?

目前,我正在做一些我想做的事情;我只是实例化/销毁Blaze视图,将元素添加/删除为chart.selectedParts

最佳答案

所以这是我如何做到的。

实际上,我认为使用Blaze.renderWithData()不是一个好的解决方案。

我发现最好的方法是在“反应模式”下传递数据,以便能够使用所有模板功能,并继续使用空格键来实例化模板。 (就像父DataContext链接一样)。

具有反应式数据源的最简单方法是始终将您的数据与您的Mongo进行匹配,因此我不必声明自定义的反应式数据源(对于复杂的js数据结构中的复杂数据源可能会很棘手)。

如果有人遇到相同的问题,我很确定这是因为您没有遵循“好的”方法(我就是这种情况)。

总是将数据库更新为反应性数据源的一个缺点是,您要进行大量UI状态更改,并且毕竟要保存更改。在这种情况下,总是绕过数据库是没有用的,但这远不是最快的解决方案。

问我,如果您在理解哲学/做事方式上有任何类似的问题,我开始了解我在做什么!

10-04 22:17
查看更多