2017-06-09 16 views
0

特定の条件でポリマー要素を追加したい。条件はサーバーから非同期に要求する必要があります条件を満たすポリマー要素を追加する

request().done(function(msg){//msg is the answer from the server}); 

Polymerのドキュメントでdom-ifが見つかりました。私が正しく理解している場合は、私がどのようにしてasynchronusメソッド呼び出しを組み合わせることは考えているかの条件

<template is="dom-if" if="{{...}}></template> 

にプロパティまたは計算プロパティを渡す必要がDOM-場合

<template is="dom-if" if="{{request().done(...)}}></template> 

編集:

別のページでdom-ifを複数回使いたいです。だから私は、問題は、そのサーバ要求が非同期であるので、私は行動で答えを返すことはできません

showElement(id: String) 

<template is="dom-if" if="{{showElement(foo)}}"></template> 

条件関数で新しい行動としてそれを実装:

showElement: function(id) { 
    request(id).done(function(anwser) { 
    return answer; 
    } 
} 

ことができます誰にも助けて?事前に

おかげ

よろしく、 クリスチャン

+0

サーバーからどのような条件を取得できますか?フォーマットは何ですか?あなたがしようとしていることは少し複雑です。さらに情報がなければ、ほとんど答えが不可能です –

+0

メソッド呼び出しに文字列としてIDを渡します。サーバーはIDによって要素が表示されるかどうかを判断し、そうでない場合はブール値を返します。 server.request( "element-id")。done(関数(anser){showElement = answer}); – Meisenmann

答えて

2

サーバーの応答を処理する方法は、お使いのDOM-場合を含む要素を認識してコンテキストにある場合、あなたはDOMにバインドさプロパティを設定することができますそれがあれば。

dom-ifを含む要素にプロパティを宣言し、デフォルトでfalseに設定します。

//properties declaration... 
showElement : { 
    type:Boolean, 
    value: false 
} 
//others properties and end of properties declaration... 

このプロパティには、サーバーの応答、そのようなものを扱う

<template is="dom-if" if="{{showElement}}">...</template> 

そして、あなたの方法でのバインドされるためにあなたは、あなたの場合はDOMを宣言します。

if(condition is met){ 
    this.showElement = true; 
} 

最後の部分は、あなたの処理関数のコンテキストがあなたの財産を含む要素とDOM-IFの一つであると仮定します。

これが当てはまらない場合は、このレスポンスを延長して取得する方法を説明するために、リクエストがどのように発生し処理されたかについてさらに詳しく知る必要があります。

+0

あなたの答えに感謝します。私は自分の投稿を編集しました – Meisenmann

+0

あなたの追加について理解しているところから、あなたのリクエストは一度実行され、条件付きのcomplexeオブジェクトを返しますが、idを持つ多くの異なるアイテムに対して、各アイテムはdom-if 。あなたのidのリストがすでに分かっているならば、同じ考え方を使うことができますが、単純なブール値のプロパティを設定する代わりに、各IDに対してプロパティをfalseに設定してオブジェクトを設定し、あなたのdom-ifは ''などになります。 – Arfost

0

サーバーがブール値を返す場合は、単純です。あなたは、単にだけで行うことができます:this.set("foo", response...)

意味

<template is="dom-if" if="{{foo}}"></template>

、サーバーからの応答を取得するたびに、あなたはfooプロパティに設定する必要があります。これが最初のステップです。あなたは、サーバーへの要求や頻度を発したいときには言及していませんでした。とにかく、画面が読み込まれたときなど、それを行うことができます。ここで非同期は問題にはなりません。

動作を使用すると効果的です。しかし、returnの代わりに、値はプロパティにのみ設定する必要があります

要約:ページが読み込まれる(または入力が変更された、またはユーザーがボタンを押した...)と、サーバー上で要求を呼び出す - >応答待ち - >応答が来たら、それを(例えば)fooのプロパティに設定してください。

最後に、fooのデフォルト値はfalseであるべきです。

上記とほぼ同じArfostです。そして、彼が右なので、問題は

EDITある

あなたのコメントによると、あなたは常に、IDの値に基づいて、サーバから1つの応答に囲まれている1つのIDを得ました。たとえば、IDが5の場合、その他のプロパティーはtrueで、このプロパティーはIDの値に変更されます。

ので、任意のコードを追加せずに、あなたがpropablyそれを行うことのようなもの:

存在しません foo1プロパティを想定し
<template is="dom-if" if="{{showElement(someID, 'foo1', foo1)}}"></template> 

showElement: function(id, property, value) { 
    if(value == undefined) { 
    request(id).done(function(answer) { 
     this.set(property, answer); 
    } 
    } 
} 

と結合は次のようになります。それを宣言してはいけません。これは条件付きif(value == undefined)のために最も重要です。それ以外の場合は呼び出されません。

showElement(someID, 'foo1', foo1)'foo1'(第2パラメータ)は、サーバーからの応答を格納する必要があるプロパティの名前を表します。 foo1(3番目のパラメータ)は、バインディングのためにここにあります。これにより、プロパティfoo1が変更されるたびに、dom-ifが注目されます。

私はそれをテストしなかったが、うまくいくと思う。

+0

リクエストは作成時に一度送信する必要があります。しかし、問題は私が複数のdom-if要素を持っているということです。 "' 次の問題は、 -ifとサーバー要求のID。しかし、私がif条件でメソッド呼び出しを使用すると、 ''のようにブール値を使うことはできません – Meisenmann

+0

@Meisenmann私は自分の答えを編集しました。それを見てください。 –

+0

あなたの答え、Kubaに感謝します。しかし、この場合は、コードを追加する必要があります(たとえば、準備完了ライフサイクルメソッドに)。dom-ifタグだけで問題を解決する方法はありますか? – Meisenmann

関連する問題