我有一個嵌套模板,使用ReactiveDict存儲數據,這是一個包含變量(顏色,類型...)和一個子節點數組的對象。更新流星,無功陣列渲染問題
我在刷新時遇到問題:數組顯示爲反應性,但是當我更新數組時,它無法正確呈現。
在短期(清理代碼):
<body>
{{#with data}}
{{>nested}}
{{/with}}
</body>
<template name="nested">
<div>{{color}}<div>
<div class="ui dropdown">
<!-- drop down stuff goes here-->
</div>
{{#if children}}
{{#each children}}
{{>nested scope=this}}
{{/each}}
{{/if}}
</template>
Template.body.helpers({
"data": { color: "blue",
children: [{color: "green", children: [{color: "teal"}]},
{color:"red", children:[{color: "cyan"}],{color: "magenta"}]]}}
})
Template.nested.onCreated(function(){
this.scope = new ReactiveDict();
this.scope.set('scope', this.data.scope);
})
Template.nested.helpers({
"color": function() { Template.instance().scope.get('scope').color;},
"children": function() {
return Template.instance().scope.get('scope').children;
}
})
Template.nested.events({
"click .ui.dropdown > .menu > .item": function(e, t) {
e.preventDefault();
e.stopPropagation();
var data = t.scope.get('scope');
//do processing stuff here...
updatedArray = myFunction();
data['children'] = updatedArray;
t.scope.set('scope', data);
}
})
所以發生了什麼事是,在更新的元素alreayd目前沒有更新,如果有元素的加入,他們露面。 如果刪除了元素,它們的元素將被刪除,但變量中的數據(此處爲顏色)不會被更新。
爲了使它工作至今,我必須做到以下幾點:
Template.nested.events({
"click .ui.dropdown > .menu > .item": function(e, t) {
e.preventDefault();
e.stopPropagation();
var data = t.scope.get('scope');
//do processing stuff here...
updatedArray = myFunction();
delete data.children;
t.scope.set('scope', data);
Meteor.setTimeout(function() {
data['children'] = updatedArray;
t.scope.set('scope', data);
},10);
}
})
這一工程,但它是一個總的黑客迫使陣列沒有再短的超時後刷新。
我該如何正確地做到這一點? PS:我嘗試在ReactiveDict
上使用allDeps.changed()
,我嘗試強制重新渲染,但它在渲染循環中,所以它不會渲染視圖兩次。 似乎無法理解數組元素未更新的原因。我知道什麼時候使用集合MiniMongo檢查對象的_id是否被更改,但我的對象中沒有_id。我也試圖添加一個,但沒有太多的運氣