在meteor中初始化新对象是否触发新模板?
我正在构建一个页面,需要创建一个矩阵,其中的数字或行和列是被动的,可以通过用户单击添加行等来更改 我使用了一个函数来准备每个单元格的内容,客户端:在meteor中初始化新对象是否触发新模板?,meteor,meteor-blaze,Meteor,Meteor Blaze,我正在构建一个页面,需要创建一个矩阵,其中的数字或行和列是被动的,可以通过用户单击添加行等来更改 我使用了一个函数来准备每个单元格的内容,客户端: function prepareCells(rows, columns){ let matrixContent = {}; ...logics here... return matrixContent; } 在客户端中,还有以下助手: Template.matrix.helpers({ matrixContents(){
function prepareCells(rows, columns){
let matrixContent = {};
...logics here...
return matrixContent;
}
在客户端中,还有以下助手:
Template.matrix.helpers({
matrixContents(){
const instance = Template.instance();
let rows = instance.state.get("rows");
let columns = instance.state.get("columns");
return prepareCells(rows, columns);
},
最后,在html Blaze页面中有如下内容:
{{#each row in matrixContents.rows}}
{{#each row.cell}}
{{> cellcontent}}
{{/each}}
{{/each}}
当反应变量发生变化时,将重新运行帮助程序。。但是cellContent模板的onCreated函数不是!例如,如果添加一行,onCreated只运行n次,其中n是当前的列数,而函数prepareCells总是返回一个新对象。在onCreated中有一些相关的逻辑,必须执行这些逻辑来初始化cellcontent的正确反应变量
Meteor使用什么模式来决定何时创建或不创建新模板?我发现了一种解决方法,cellcontent的助手和内部模板使用currentData:
Template.cellcontent.helpers({
getFoo(){
let data = Template.currentData();
...logic with the "real" data inside the cellcontent
}
因为依赖于reactiveDict的cellcontent的助手会发现意外值,因为reactiveDict是在创建时启动的,并不总是运行,例如:
Template.cellcontent.helpers({
getFoo(){
let template = Template.instance();
instance.state =....you get unexpected data here
}
有关于这种行为的参考资料吗 为了重新运行一次创建的函数,您需要a添加自动运行b将其绑定到反应源,因此源触发自动运行,最后c传入一些数据以触发自动运行
根据上面的示例,这可能如下所示:
Template.cellcontent.onCreatedfunction cellContentOnCreated{
const instance=this;
instance.state=new ReactiveDict;//保存处理后的数据
//a-在更改传入数据时自动运行此实例
instance.autorunfunction自动运行{
//b-自动绑定到反应式数据源
//因为Template.currentData处于被动上下文中
//如果更改,自动运行将自动重新运行
const data=Template.currentData;
const processedData=/…处理传入数据
set'processedData',processedData;
};
};
Template.cellcontent.helpers{
格特福{
返回Template.instance.state.get'processedData';
}
};
为了实现c,您需要将一些数据传递到单元格内容模板:
{{#each row in matrixContents.rows}}
{{#each row.cell}}
{{> cellcontent data=this}}
{{/each}}
{{/each}}
注意,这表示每个块中的当前元素,并且要求row.cell是单元格内容元素的数组。如果不是这样,您可以查看此结构并重新组织它,以便将单元格内容数据传递到cellcontent模板。您需要将基于反应的逻辑置于自动运行中创建的OnCreate上-谢谢,参考帮助我更好地理解引擎,如果您发布它,我将检查它作为答案!