2016-05-12 80 views
1

我需要在運行時設置聚合物網絡組件的行爲。我試圖通過推動新行爲來改變「行爲」數組,但它不起作用。有沒有適當的方法來做到這一點?聚合物:在運行時註冊行爲

我想創建一個表的web組件與底部的尋呼機。它應該是可擴展的,允許從JavaScript數組,一個寧靜的服務或自定義源加載數據。因此,我決定爲每個來源創建一個行爲,並在來源發生變化時對其進行更改。這是設計它的正確方法嗎?

這裏舉例說明從數組中加載數據的行爲the source code。它具有以下功能:

itemsLoad: function(page, itemsPerPage, callback) {... 

其從網絡的組件調用裝載特定的頁的數據。我的想法是,基於數據源類型(例如CSV,JSON等)的每種行爲都將以不同的方式實現此方法。然後,該行爲將在運行時進行註冊,因爲在運行時開發人員知道哪個來源可以使用。

回答

1

我不認爲你將能夠在運行時改變行爲,因爲它們被混合到元素原型中。

你可以做的是爲你的每個案例(csv,json等)創建一個單獨的元素並根據需要動態創建節點。你可以不是將這個元素網格

<table-component> 
    <json-data-source></json-data-source> 
</table-component> 

<table-component>將尋找它實現itemsLoad獲取數據的子元素中。

編輯

要使用你會使用Polymer's DOM API子節點工作。例如,您可以偵聽添加的子節點並選擇一個實現itemsLoad方法的節點。

Polymer({ 
    attached: function() { 
    Polymer.dom(this).observeNodes(function(info) { 
     var newNodes = info.addedNodes; 

     for(var i=0; i<newNodes.length; i++) { 
     var dataSource = newNodes[i]; 

     if(dataSource.itemsLoad && typeof dataSource.itemsLoad === 'function') { 
      this.loadItems(dataSource); 
      break; 
     } 
     } 
    }); 
    } 

    loadItems: function(dataSource) { 
    dataSource.itemsLoad().then(...); 
    } 
}); 

你可以用簡單的迭代超過Polymer.dom(this).children更換Polymer.dom(this).observeNodes。哪一個最適合你。

+0

感謝您的回覆。我如何查找子元素並確定它是否實現了itemsLoad? –

+0

聚合物基本上就像普通的DOM操作一樣。並檢查元素是否實現了一個函數?檢查它是否存在。查看更新的答案 –