2014-04-01 47 views
1

所以我有一堆的模板將與{{#each game}}迭代出下面的模板:如何隱藏流星中的動態元素?

<template name="game"> 
{{#if condition}} 
    <div class="box"> 
     Page 1 
    </div> 
{{else}} 
    <div class="box"> 
     Page 2 
    </div> 
{{/if}} 
</template> 

我想顯示「第2頁」在單擊「1」對話框時,所以我有以下:

Template.game.events({ 
    'click .box': function(e) { 
     Session.set("condition", true); 
    } 
}); 

但我不希望所有其他遊戲模板轉換到第2頁,只是被點擊的那個。我該如何做到這一點?

編輯:更改應該隻影響當前用戶,不是所有用戶。

回答

1

假設您的遊戲存儲在Meteor.Collection,並condition是應該反映所有用戶的文檔的屬性,而不僅僅是當前的一個,你可以做這樣的事情:

Template.game.events({ 
    'click .box': function(event, template) { 
     Games.update(
      {_id: template.data._id}, 
      {$set: {condition: !template.data.condition}} 
     ); 
    } 
}); 

如果只會影響當前用戶,您可以使用模板實例特定的會話變量和一個輔助函數返回它稱爲condition

Template.game.events({ 
    'click .box': function(event, template) { 
     Session.set("condition-" + template.data._id, true); 
    } 
}); 

Template.game.condition = function() { 
    return Session.get("condition-" + this._id); 
}; 

你可以用LOCA實現類似的功能l集合。

+0

啊,我應該指定它應該隻影響當前用戶。 –

1

請勿使用會話變量!原因是你有問題,他們相當於舊的全局變量。使用模板的數據,它是本地的,可以在這種情況下用來控制行爲。

對於您的示例模板:

Template.game.created = function() { 
    this.data.conditionValue = 'something'; 
    this.data.conditionDep = new Deps.Dependency(); 
}; 

Template.game.condition = function() { 
    this.conditionDep.depend(); 
    return this.conditionValue; 
}; 

Template.game.events({ 
    'click .box': function(e, t) { 
    t.data.conditionValue = 'somethingElse'; 
    t.data.conditionDep.changed(); 
    }, 
}); 
+0

嗯,我從來沒有嘗試過,因爲這個警告在模板實例的數據屬性的文檔中:「訪問是隻讀和非響應。」以及「您目前無法從助手訪問模板實例對象,我們計劃重構模板實例的工作方式,並使其更容易訪問。」如果這可行,那麼它肯定比在會話密鑰中使用帶'_id'的會話變量更清晰。 – sbking

+0

第二部分是正確的,你不從助手訪問模板,只是它作爲上下文提供的數據。這種訪問確實沒有反應,這就是爲什麼你需要提供自己的依賴。我沒有注意到有關數據是隻讀的警告,我也沒有任何問題 - 我始終使用這種模式。是否有可能檢查,因爲那時有警告?也許這是新的,但我沒有注意到當前版本中的任何問題。 –

+1

經過一些測試後,似乎添加到模板實例的'data'對象的任何自定義字段在從'meteor mongo'控制檯對文檔進行更改時被刪除。我認爲這可能也適用於其他流星用戶或服務器所做的更改。不幸的是,現在最好的做法是使用'Session',一個本地集合或一個不在模板實例中的自定義反應數據源。如果/當助手可以訪問模板實例本身,直接向它添加字段可能是安全的,而不是'data'。 – sbking