2017-01-19 2 views
1

私のアプリケーションに埋め込まれたつぶやきをレンダリングしようとしています。私はtweet Id(tweetId)のmongoコレクションを持っています。私は(文書)_idをdiv内のIDとして使用していますので、Twitterはそのツイートの特定の要素を対象とすることができます。DOM要素が作成されるのを待つヘルパーを取得するには? [流星]

テンプレート:私は実行する "embeddedTweet" ヘルパーで

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

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

私はthis._idがにconsole.logのテストを通じて正確である知っています。私はまた、上のdom要素の検索が未定義に終わることを確認しました。

だから、データコンテキストが流星を経由してありますようだが、(DOM要素をgetElementByIdをから存在する前に。すなわち)私はあまりにも速くtwttr呼び出すのですか?

挑戦はtwttrは、各呼び出しのためのユニークなDOMのIDを必要とすることです。

ここではより良いパターンがあります。

答えて

0

あなたはDOM要素の後に行くことができる前に、テンプレートがレンダリングされますまで待たなければなりません。

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

を入力すると、クエリを実行してDOMの子を見つけ、twitter APIを呼び出すことができます。データが更新されており、テンプレートがレンダリングされているので、ヘルパーで行うものは冪等する必要がある一方で

ヘルパーが複数回実行することができます。理想的にはAPIにヒットしません。

+0

私がテストしonRenderedとonCreatedにはconsole.logを追加しましたが、彼らが一度だけ実行するようです。私はそれらが{{#each}}を介してコレクション内のすべてのアイテムに対して実行されることを期待しましたが、DOMが更新されたようですが、テンプレートは再レンダリングされません。 2回目の試みとして、私はtwttrの呼び出しをサーバー上のメソッドに移しましたが、デフォルトでは – ppedrazzi

+0

のスクリプトを介してクライアントを読み込んでいるので、クライアントはそのライブラリを理解する唯一のクライアントだと思われ、onRendered()は一度。実行時にすべてのDOM要素が存在しない場合は、Template.currentData()やfind()(つまり、あなたのツイートデータのソースに関係なく、autorun()内に何か反応的なものを置くことによって、 )です。 – zim

+0

ありがとうございました。それで遊ぶだろう... – ppedrazzi

関連する問題