2015-06-09 14 views
6

Ich versuche, ein Attribut zu einer iron-ajax Vorlage dynamisch zuzuweisen, aber es wird in undefiniert aufgelöst.Warum verschwindet die Eigenschaft dieses Polymerelements zu undefiniert?

<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> 

Die resultierende URL sieht wie folgt aus:

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

Die dom-module ‚s categoryid Eigenschaft ist nicht undefined wie ich die richtige Eigenschaftswert auf den Attributen reflektiert sehen können, was bedeutet es, etwas zu tun, wie Ich weise es dem Attribut zu. Ich habe das auch auf den created und attached Callbacks versucht und immer noch nicht funktioniert.

Edit: Die categoryid an das Modul übergeben, wenn es wie folgt instanziieren:

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

Wie hier die an den Dienst weitergegeben categoryid gesehen bereits einen Wert hat. (Die Elementnamen auf dem Bild kann etwas anders sein. Ich sie verkürzt die Frage weniger ausführlich zu machen.)

enter image description here

Der category-products-list in dem die Dienstleistung wie folgt aussieht

<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

Woher kommt der categoryid kommen aus? Wo findet es statt? Was passiert, wenn Sie console.log hinzufügen (this.categoryid); in deiner fertigen Funktion? –

+0

Ich habe die Frage mit den gesuchten Informationen bearbeitet. Wenn ich 'console.log (this.categoryid);': Ich bekomme 'undefined' –

+0

das Problem ist, wie Sie die KategorieID in die Produkte-Service übergeben ... es ist kein Problem in der Produkt-Service-Element selbst . Wenn Sie tun, wird es funktionieren. Die nächste Frage ist also, woher bekommst du das categoryid? Ich weiß nicht, woher du die {{categoryid}} bekommst, aber ich nehme eine wilde Vermutung: Du könntest versuchen

Antwort

6

aufgerufen wird Ich denke, Sie stoßen hier auf eine Kombination von Problemen und müssen Ihre Struktur etwas überdenken.

Da das Attribut categoryid außerhalb des Elements gebunden ist, ist der Anfangswert nicht definiert. Grundsätzlich wird Ihr Element erstellt und angefügt, wobei alle Lebenszyklusmethoden ausgeführt werden, und dann Kategorieid wird festgelegt. Dies bedeutet auch, dass, weil Sie eine iron-ajax mit auto gesetzt haben, wird es zunächst versuchen, eine Anfrage mit den Informationen zu machen, die es zuerst gegeben wird.

Meine empfohlenen Änderungen:

<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

Wenn ich das tue id spiegelt sich nicht in der resultierenden 'URL' wider, nicht einmal mit einem Wert von' undefiniert'. –

+0

@OptimusPette Ich vermute, dass die'Eisen-Ajax'-Komponente nicht erkennt, dass ihre Parameter aktualisiert wurden. Versuchen Sie 'this. $. Productsajax.set ('params.id', this.categoryid);' – Zikes

+0

gleicher Effekt, keine ID in den Parametern gesetzt. –

0

das Problem ist, wie Sie die categoryid in den Produkte-Dienst übertragene ... es ist kein Problem, in dem Produkte-Service-Elemente selbst. Wenn Sie <products-service categoryid="5"></products-service> tun, wird es funktionieren. Offensichtlich gibt es viel mehr Komplexität Ihrer Anwendung, aber ich erstellt ein paar einfache Elemente, die korrekt funktionieren:

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> 

Produkt-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> 

Produkt -service.html:

0

Zikes Diagnose ist korrekt, der Grund, warum dies undefiniert zurückgibt Der Seitenlebenszyklus ist abgeschlossen, bevor die Daten auf die Seite geladen werden. Allerdings konnte ich seine Antwort für meine Lösung nicht bekommen. (Wahrscheinlich ein Fehler meinerseits, irgendwo.) Meine API verwendet auch Query-Strings, um Daten zu übertragen, während deins dies nicht tut, ich glaube, dass diese Antwort für jeden hilfreich sein wird, der in diese Situation eindringt wie ich.Um dieses Problem zu lösen, habe ich meinem Objekt einen Beobachter hinzugefügt, basierend auf dieser Antwort von https://www.polymer-project.org/1.0/docs/devguide/observers. Ich habe den einfachen Beobachter benutzt. Ich glaube, Zikes benutzt ein komplexes.

<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; 
 
    },