2017-06-09 56 views
0

我想在某些條件下添加聚合物元素。必須從服務器異步請求條件有條件地添加聚合物元素

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

我在Polymer文檔中找到了dom-if。如果我理解正確的,我必須要通過一個屬性或計算屬性如果條件

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

我不知道如何將asynchronus方法調用與結合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作爲字符串傳遞給方法調用。服務器根據標識符確定該元素是否被顯示,否則返回一個布爾值。 server.request(「element-id」)。done(function(anser){showElement = answer}); – Meisenmann

回答

2

如果方法處理您的服務器響應是在上下文感知包含的元素的DOM,如果,您可以設置綁定到你的DOM屬性如果它在。

你在包含dom-if的元素中聲明瞭一個屬性,默認情況下將它設置爲false。

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

你宣佈你的DOM,如果對這個屬性

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

而在你的方法處理服務器響應,類似的東西被綁定。

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

最後一部分假設你的處理函數的上下文是包含屬性和DOM,如果你的元素之一。

如果不是這種情況,我需要更多關於請求被觸發和處理的細節,以擴展此響應並解釋如何檢索它。

+0

謝謝你的回答。我已經編輯了我的帖子 – Meisenmann

+0

好的,根據我對添加的理解,您的請求會運行一次,並返回一個複雜對象與條件,但對於許多具有ID的不同項目,並且每個項目應該有一個dom-if 。如果你已經知道你的id列表,你可以使用相同的想法,但不是設置一個簡單的布爾屬性,而是爲每個id設置一個屬性設置爲false的對象,並在獲得響應時更改它。並且你的dom-if變成了''etc ... – Arfost

0

如果你的服務器返回布爾值,那麼它很簡單。你可以簡單地只是做:

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

這意味着,只要你從服務器獲取的響應,你必須將其設置爲foo屬性:this.set("foo", response...)。這是第一步。您沒有提及何時向服務器發起請求或多久發生一次。無論如何,你可以做到這一點,例如,當屏幕加載或任何。那麼異步在這裏不會成爲問題。

使用行爲很好。但不是return它應該只對屬性設置值

總結:當頁面被加載(或者輸入被改變,或者用戶按下按鈕...)時,你在服務器上調用請求 - >等待響應 - >當響應來了,將它設置爲(例如)foo屬性 - >就是這樣。

而最後一件事情,默認值foo應該是propely false

幾乎與上面提到的Arfost相同。他是對的,那麼問題出在哪裏

編輯

根據您的意見,你得始終爲1 ID其爲界,基於ID的價值從服務器1級的響應。例如,如果ID是5,那麼其他一些屬性是true,並且此屬性在Id的值上發生更改。

因此,無需任何額外的代碼,你可以做propably它像:

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

,並結合將是這樣的:

<template is="dom-if" if="{{showElement(someID, 'foo1', foo1)}}"></template> 

假設財產foo1不存在。你不能聲明它。這是最重要的,因爲有條件的if(value == undefined)否則它不會被稱爲。

只是爲了解釋showElement(someID, 'foo1', foo1)'foo1'(第二個參數)表示應該存儲來自服務器的響應的屬性名稱。 foo1(第三個參數)在這裏,因爲綁定。由於這一點,dom-if將得到關注,每當屬性foo1變化。

我沒有測試它,但我認爲它可能工作。

+0

該請求只能在創建時發送一次。但問題是我有一個以上的dom-if元素'' 接下來的問題是我需要關聯dom -if和服務器請求的ID。但是當我使用方法調用if條件 ''我不能使用像建議的布爾值 – Meisenmann

+0

@Meisenmann我編輯了我的答案。看看吧 –

+0

謝謝你的回答,庫巴。但在這種情況下,我不得不另外添加代碼(例如添加到生命週期方法)。有沒有辦法只用dom-if標籤來解決問題? – Meisenmann