2015-06-09 76 views
6

我試圖動態地爲iron-ajax模板分配一個屬性,但它解析爲undefined。爲什麼這個聚合物元素的屬性解析爲undefined?

<dom-module id="products-service"> 
    <style> 
    :host { 
     display: none; 
    } 
    </style> 

    <template> 
    <iron-ajax id="productsajax" 
     auto 
     url="http://localhost:3003/api/taxons/products" 
     params='{"token":"my-token"}' 
     method='GET' 
     on-response='productsLoaded' 
     handleAs='json'> 
    </iron-ajax> 
    </template> 
</dom-module> 

<script> 
(function() { 
    Polymer({ 
     is: 'products-service', 

     properties: { 
      categoryid: { 
       type: String, 
       notify: true, 
       reflectToAttribute: true 
      } 
     }, 

     //here I am trying to add and `id` to the `iron-ajax` `params` attribute. 
     ready: function() { 
      this.$.productsajax.params.id = this.categoryid; 
     } 
    }); 
})(); 
</script> 

所顯示的網址是這樣的:

`http://localhost:3003/api/taxons/products?token=my-token&id=undefined` 

dom-modulecategoryid屬性不是undefined我可以看到正確的屬性值反映在屬性,這意味着它是與如何我將它分配給屬性。我也嘗試過createdattached回調,但仍然無法正常工作。

編輯:

<products-service products="{{products}}" categoryid="{{categoryid}}"></products-service> 

由於這裏的categoryid傳遞給服務看到已經有值: 這樣的實例它時,categoryid被傳遞到模塊。 (在圖像上的元素名稱可能會略有不同。我縮短了他們,使問題更簡潔。)

enter image description here

category-products-list當服務被稱爲這個樣子的

<dom-module id="category-products-list"> 
    <template> 
    <category-products-service products="{{products}}" categoryid="{{categoryid}}"></category-products-service> 
    <div> 
     <template is="dom-repeat" items="{{products}}"> 
     <product-card on-cart-tap="handleCart" product="{{item}}"> 
     <img width="100" height="100"> 
     <h3>{{item.name}}</h3> 
     <h4>{{item.display_price}}</h4> 
     </product-card> 
    </template> 
    </div> 
</template> 

</dom-module> 

<script> 
(function() { 
    Polymer({ 
    is: 'category-products-list', 

    properties: { 
    categoryid: { 
     type: String, 
     notify: true, 
     reflectToAttribute: true 
    } 
    }, 

ready: function() { 
    //this is undefined too 
    console.log("categoryid in the list module: "+categoryid) 
    } 
    }); 
    })(); 
</script> 
+0

哪裏的類別ID從何而來?它在哪裏設置?當你添加console.log(this.categoryid)時會發生什麼;在你準備好的功能? –

+0

我已經用你所尋求的信息編輯了這個問題。當我做'console.log(this.categoryid);':我得到'undefined' –

+0

問題是你如何將categoryid傳遞到products-service中......它不是產品服務元素本身的問題。如果您執行,它將起作用。所以接下來的問題是,你從哪裏得到分類ID?我不知道你從哪裏獲得{{categoryid}},但我會大膽猜測:您可以嘗試

回答

6

我認爲你遇到了一些問題,需要稍微反思一下你的結構。

首先,因爲categoryid屬性綁定在元素之外,所以它的初始值將是未定義的。基本上,您的元素已創建並已連接,所有生命週期方法都會運行,然後 categoryid被設置。這也意味着,因爲您有iron-ajaxauto集合,它會首先嚐試使用它首先給出的信息發出請求。

我的修改建議:

<dom-module id="products-service"> 
    <style> 
    :host { 
     display: none; 
    } 
    </style> 

    <template> 
    <iron-ajax id="productsajax" 
     url="http://localhost:3003/api/taxons/products" 
     params='{"token":"my-token"}' 
     method='GET' 
     on-response='productsLoaded' 
     handleAs='json'> 
    </iron-ajax> 
    </template> 
</dom-module> 

<script> 
(function() { 
    Polymer({ 
     is: 'products-service', 

     properties: { 
      categoryid: { 
       type: String, 
       notify: true, 
       reflectToAttribute: true 
      } 
     }, 

     observers: [ 
      // Note that this function will not fire until *all* parameters 
      // given have been set to something other than `undefined` 
      'attributesReady(categoryid)' 
     ], 

     attributesReady: function(categoryid) { 
      this.$.productsajax.params.id = categoryid; 

      // With the removal of `auto` we must initiate the request 
      // declaratively, but now we can be assured that all necessary 
      // parameters have been set first. 
      this.$.productsajax.generateRequest(); 
     } 
    }); 
})(); 
</script> 
+0

當我這樣做時編號並不反映在所產生的'url'中,甚至沒有'undefined'的值。 –

+0

@OptimusPette我懷疑'iron-ajax'組件沒有意識到它的參數被更新了。試試'this。$。productsajax.set('params.id',this.categoryid);' – Zikes

+0

效果相同,在參數中沒有設置id。 –

0

問題是你如何傳遞到類別ID產品服務......這是不是在產品,服務元素本身就是一個問題。如果你做<products-service categoryid="5"></products-service>它會工作。很明顯,有很多更復雜的應用程序,但我創造了一些其正常工作的簡單元素:

的index.html:

<!DOCTYPE html> 
<html> 

<head> 
<meta charset="UTF-8"> 
<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes"> 
<meta name="mobile-web-app-capable" content="yes"> 
<meta name="apple-mobile-web-app-capable" content="yes"> 

<title>My Test</title> 

<!-- Load platform support before any code that touches the DOM. --> 
<script src="bower_components/webcomponentsjs/webcomponents-lite.min.js"> </script> 

<link rel="import" href="elements/product-list.html"> 

</head> 

<body> 
    <product-list categoryid="5"></product-list> 
</body> 

</html> 

產品list.html:

<link rel="import" href="../bower_components/polymer/polymer.html"> 
<link rel="import" href="../elements/product-service.html"> 


<dom-module id="product-list"> 
<style> 

</style> 

<template> 
<product-service categoryid="{{categoryid}}"></product-service> 
</template> 
</dom-module> 

<script> 
Polymer({ 
    is: 'product-list' 
}); 
</script> 

產品-service.html:

<link rel="import" href="../bower_components/polymer/polymer.html"> 
<link rel="import" href="../bower_components/iron-ajax/iron-ajax.html"> 


<dom-module id="product-service"> 
<style> 

</style> 

<template> 
<iron-ajax id="productsajax" 
    auto 
    url="http://localhost:3003/api/taxons/products" 
    params='{"token":"my-token"}' 
    method='GET' 
    on-response='productsLoaded' 
    handleAs='json'> 
</iron-ajax> 
</template> 
</dom-module> 

<script> 
Polymer({ 
    is: 'product-service', 
    properties: { 
     categoryid: { 
       type: String, 
       notify: true, 
       reflectToAttribute: true 
       } 
}, 

//here I am trying to add and `id` to the `iron-ajax` `params` attribute. 
ready: function() { 
console.log(this.categoryid); 
this.$.productsajax.params.id = this.categoryid; 
}, 
productsLoaded: function(e) { 
console.log('Response'); 
} 

}); 
</script> 
0

Zikes診斷是正確的,這是返回undefined的原因是頁面生命週期在數據加載到頁面之前完成。但是,我無法得到他的答案爲我的解決方案工作。 (可能是我的錯誤,在某處。)我的api也使用查詢字符串來傳遞數據,而你的不這樣做,我相信這個答案對任何遇到這種情況的人都會有幫助,就像我一樣。爲了解決這個問題,我添加了一個觀察者到我的財產,我從https://www.polymer-project.org/1.0/docs/devguide/observers這個答案。我使用了簡單的觀察者。我相信Zikes正在使用一個複雜的。

<iron-ajax id="productsajax" url= {{ajaxUrl}} method='GET' 
 
     on-response='productsLoaded' handleAs='json'> 
 
</iron-ajax> 
 

 
Polymer({ 
 
    is: 'product-service', 
 
    properties: { 
 
      categoryid: { 
 
       type: String, 
 
       notify: true, 
 
       reflectToAttribute: true, 
 
       observer: 'catIdReady' 
 
      }, 
 
      ajaxUrl: { 
 
       type: String, 
 
       notify: true 
 
      } 
 
    }, 
 
    catIdReady: function (catidnew, catidold) { 
 
     this.set('ajaxUrl', this._getAjaxUrl()); 
 
     this.$.productsajax.generateRequest(); 
 
     console.log("catidReady!" + catidnew); 
 
    }, 
 
    _getAjaxUrl: function() { 
 
     console.log(this.categoryid); 
 
     return 'http://localhost:3003/api/taxons/products?categoryId=' + 
 
     this.categoryid; 
 
    },