2017-01-19 67 views
1

我想在我的应用程序中呈现嵌入的推文。我有一个鸣叫Ids(tweetId)的mongo集合。我使用(document)_id作为div中的id,以便Twitter可以针对推文的特定元素。如何让助手等待DOM元素被创建? [流星]

模板:

{{#each mongoCollectionOfTweetIds}} 
    <div id={{_id}}> 
    {{embeddedTweet}} 
    </div> 
{{/each}} 

在 “embeddedTweet” 帮助我运行:

targetElement = document.getElementById("#{this._id}") 
twttr.widgets.createTweet("#{this.tweetId}", targetElement) 

我知道this._id是通过测试的console.log准确。我还证实,查找上面的dom元素最终未定义。

所以,似乎数据上下文是通过流星,但我打电话twttr太快(即在dom元素存在之前从getelementbyid)?

挑战在于twttr为每个呼叫都需要一个唯一的dom ID。

希望这里有更好的模式。

回答

0

您必须等到模板已经呈现后再继续使用DOM元素。

Template.Foo.onRendered(function() { 
}); 

在那里,你可以运行你的查询找到你的DOM的孩子,并呼吁到Twitter API。

助手可以在数据更新和模板渲染时运行多次,所以在助手中完成的任何操作都应该是幂等的。理想情况下不会碰到API。

+0

我添加了一个console.log到onRendered和onCreated来测试,但它似乎只运行一次。我期望他们通过{{#each}}为集合中的每个项目运行,但似乎dom已更新,但该模板未重新呈现。作为第二次尝试,我将twttr调用移到了服务器上的一个方法中,但似乎客户端是唯一一个了解该库的人,因为默认情况下我通过脚本在 – ppedrazzi

+0

中加载它,onRendered()将只运行一次。如果所有的DOM元素都没有运行,你可以通过在autorun()中加入一些反应,如Template.currentData()或find()(无论你的tweet数据的来源是什么)是)。 – zim

+0

谢谢zim。会玩那个... – ppedrazzi