2016-02-18 69 views
1

我有一個嵌套模板,使用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。我也試圖添加一個,但沒有太多的運氣

回答

0

以及我想我剛剛纔問出來...... '_id'的事情伎倆。我曾嘗試過,但我實際上使用相同的_id爲相同的元素,所以他們似乎並沒有改變(杜!)

因此,通過在我生成的對象中添加{ "_id": Meteor.uuid() }更新正常工作。