2015-01-02 17 views
5

पर फ़ंक्शन विशेषता जोड़ने के लिए कैसे मैं फ़ंक्शन विशेषता के साथ एक बहुलक तत्व बनाना चाहता हूं, जिसे सफलता प्रतिक्रिया मिलने पर बुलाया जाएगा।पॉलिमर तत्व

<foo-bar url="/api/getdata" succCallback="func"></foo-bar> 

func function(){ 
    alert('hi'); 
} 

मैंने कोशिश की यह:

<polymer-element name="foo-bar" attributes="url succCallback"> 
<template> 
     <core-ajax id="ajax" method="POST" 
     url="{{url}}" 
     contentType="application/json" 
     handleAs="json" 
     on-core-response="{{handleResponse}}"></core-ajax> 
</template> 
<script> 
    Polymer({ 
     handleResponse: function(e){ 
      var response = e.detail.response; 
      if (response.status === 'success') { 
       // call succCallback 
       this.fire(succCallback); 
      } 
     } 
    }); 
</script> 
</polymer-element> 

यह काम नहीं करता। मैं इस succCallback फ़ंक्शन को कैसे कॉल कर सकता हूं? धन्यवाद!

उत्तर

2

मैं कोई रास्ता नहीं लगता है, क्योंकि

attributes attr केवल तार खपत करता है।

<foo-bar url="/api/getdata" succEventTrigger="foo-bar-done"></foo-bar> 

फिर, बहुलक के लिए श्रोता देते हैं और succEventTrigger

var fooBar = document.querySelector('foo-bar'); 
    sayHello.addEventListener('foo-bar-done', function(e) { 
    alert('hi'); 
    }); 

और बहुलक पकड़ने:

<polymer-element name="foo-bar" attributes="url succEventTrigger"> 
<template> 
     <core-ajax id="ajax" method="POST" 
     url="{{url}}" 
     contentType="application/json" 
     handleAs="json" 
     on-core-response="{{handleResponse}}"></core-ajax> 
</template> 
<script> 
    Polymer({ 
     succEventTrigger : '', 
     handleResponse: function(e){ 
      var response = e.detail.response; 
      if (response.status === 'success') { 
       // trigger callback event with parameter if needed 
       this.fire(succEventTrigger, { param : value }); 
      } 
     } 
    }); 
</script> 
</polymer-element> 
+0

धन्यवाद! यह काम कर रहा है! मैंने पाया कि यह भी काम करता है अगर मैं इस 'विंडोज़ [succCallback](); जैसे succCallback को कॉल करता हूं;', लेकिन मुझे नहीं पता कि इसका उपयोग करने का कोई दुष्प्रभाव है या नहीं। – Jie

+0

यह सच है कि यह भी काम करता है, लेकिन मैंने विशेष रूप से उस दृष्टिकोण से परहेज किया क्योंकि इसमें विंडो ऑब्जेक्ट के साथ बातचीत शामिल है .. जो डिफ़ॉल्ट रूप से अच्छा नहीं है :) –

0

this.fire(succCallback()); के साथ this.fire(succCallback); को बदलने का प्रयास करें।

+1

यह या तो काम नहीं करता। यह त्रुटि मिली: Uncaught TypeError: स्ट्रिंग फ़ंक्शन नहीं है – Jie

0

संपादित करें:

से समस्या का समाधान हो सकता है निम्न मुझे एहसास हुआ कि एक कुछ मिनट देर से मेरा प्रारंभिक उत्तर विफलता के वास्तविक बिंदु से चूक गया। बहुलक तत्व परिभाषा ठीक है, लेकिन इसके बारे में उपयोग करते हैं, एक टेम्पलेट में लिपटे होने की जरूरत है, ताकि आप कुछ इस तरह कर सकते हैं:

<body> 
<template is="auto-binding"> 
    <foo-bar url="/api/getdata" succCallback="{{func}}"></foo-bar> 
</template> 
<script> 
    var scope = document.querySelector('template[is=auto-binding]'); 

    scope.func = function (whatever) { 
    console.log('yay!'); 
    }; 
</script> 
</body> 

मूल जबाब नीचे अभी भी उपयोगी हो सकता है - विशेष रूप से जहां कॉलबैक है उपयोग किया गया।

'प्रकाशित करें' गुण के बजाय ब्लॉक ... एर, विशेषता (मैं अब महसूस करते हैं कि इस त्रुटि का कारण नहीं था) का उपयोग करना:

<polymer-element name="foo-bar"> 
<template> 
     <core-ajax id="ajax" method="POST" 
     url="{{url}}" 
     contentType="application/json" 
     handleAs="json" 
     on-core-response="{{handleResponse}}"></core-ajax> 
</template> 
<script> 
    Polymer({ 
     publish: { 
      url: undefined, 
      succCallback: undefined, 
     }, 
     ready: function(){ 
      this.url = this.url || "some default"; 
      this.succCallback = this.succCallback || function(){}; 
     }, 
     handleResponse: function(e){ 
      var response = e.detail.response; 
      if (response.status === 'success') { 
       // call succCallback 
       this.succCallback(); 
      } 
     } 
    }); 
</script> 
</polymer-element> 

मैं वास्तव में एक जवाब के लिए खोज रहा था 'क्या यह पॉलिमर में कर्षण के साथ एक पैटर्न है, या यह निराश है?'। कॉलबैक के उपयोग के रूप में Communication and Messaging docs में भी उल्लेख नहीं किया गया है, मैं काफी उत्सुक हूं।

0

अपने कस्टम बहुलक तत्व का उदाहरण बनाते समय, आपको गुणों के रूप में पारित फ़ंक्शन नामों में पैरामीटर ब्रैकेट जोड़ने की आवश्यकता है।

अर्थात बजाय:

<foo-bar url="/api/getdata" succCallback="func"></foo-bar> 

कार्य करें:

<foo-bar url="/api/getdata" succCallback="func()"></foo-bar> 

के अनुसार करने की कोशिश की और सच (अभी तक कुछ हद तक अफैशनवाला):

<body onload="handleLoad()"></body> 
संबंधित मुद्दे