2012-05-29 12 views
11

मैं कुछ कमी हो सकती है, लेकिन ऐसा लगता है कि उल्का के "जादू" हैंडल के माध्यम से डोम तत्वों के लिए बाध्यकारी आसपास डेटा, और अद्यतन पाठ और HTML टुकड़े घूमती है: http://docs.meteor.com/#reactivityउल्का - स्वचालित रूप से सब्स्क्राइब किए गए डेटा के साथ कैनवास अपडेट कर रहा है?

यह महान है, तथापि, जब लिखने की कोशिश कर कि एक < कैनवास > तत्व के लाइव डेटा प्रदर्शित करता है एक उल्का अनुप्रयोग, मैं "उल्का रास्ता" मेरे कैनवास अद्यतन करने के लिए को समझ नहीं सकता जब लाइव डाटा परिवर्तन, कैनवास की तरह जे एस कोड के माध्यम से से भर जाता है के बाद से:

var g = canvas.getContext('2d') 
g.fillRect(x, y, w, h) 

और HTML टेम्पलेट में डेटा-समर्थित टेक्स्ट नहीं।

मैं एक उल्का से डेटा का उपयोग कर कैनवास पर आकर्षित करने की कोशिश कर रहा हूं। चयन।

मेरा एकमात्र विचार एचटीएमएल टेम्पलेट में एचटीएमएल टेम्पलेट में एचटीएमएल टेम्पलेट में एम्बेड किए गए स्क्रिप्ट टैग में कैनवास-ड्राइंग जेएस कोड को एम्बेड करना था, लेकिन यह गलत लगता है क्योंकि उल्का की घटनाओं और डेटा-बाध्यकारी कोड पहले से ही क्लाइंट-साइड जेएस है।

क्या लाइव डेटा परिवर्तनों के लिए कुछ तरीका सुनता है, जो HTML तत्वों/टेक्स्ट के बजाय जेएस के माध्यम से कैनवास पर चित्रित करता है? नीचे टॉम की जवाब मुझे Meteor.deps है, जो एक प्रतिक्रियाशील संदर्भ में मनमाने ढंग से कोड को क्रियान्वित करने की अनुमति के लिए देखने के लिए नोटिस दिया:: http://docs.meteor.com/#on_invalidate

कृपया मुझे बताएं कि मैं किसी तरह

अद्यतन में प्रश्न को स्पष्ट कर सकते हैं

मैं इसे आजमाउंगा और यहां काम करता हूं अगर यह काम करता है।

+0

मैं मुझे यकीन नहीं है कि यह आपके द्वारा "एम्बेडेड ... एक स्क्रिप्ट टैग में" है। वर्तमान में मैं अपने कैनवास युक्त टेम्पलेट में {{drawCanvas}} डालने की तरह कुछ कर रहा हूं, और funCion के अंदर सभी ड्राइंग करें जो "drawCanvas" नामक Template.canvas.helper का हिस्सा है, यह फ़ंक्शन कुछ भी नहीं देता है, इसलिए कुछ भी नहीं मिलता है प्रस्तुत किया गया, लेकिन इसे निष्पादित किया गया है ताकि यह कैनवास अपडेट कर सके। क्या आप पहले से ही कोशिश कर चुके हैं? Template.name.helper स्वचालित रूप से प्रतिक्रियाशील है, जब तक कि यह एक प्रतिक्रियाशील डिक्ट या कुछ मॉडल पर निर्भर करता है, यह तदनुसार अपडेट हो जाएगा क्योंकि यह –

+0

बदल गया है जिसका अर्थ है कि उस टिप्पणी का अर्थ था जेएस कोड को टेम्पलेट में एक स्ट्रिंग के रूप में गतिशील रूप से उत्पन्न करना था (जो है जाहिर है अजीब)। नीचे मेरा जवाब उल्का – 7zark7

+0

के साथ "सही" तरीका प्रतीत होता है जो वास्तव में बेतुका है! लेकिन क्या मेरी विधि ठीक दिखती है? विचार सिर्फ एक अदृश्य {{drawCanvas}} का उपयोग कर रहा है जो कुछ भी नहीं करता है, जो कुछ प्रतिक्रियाशील डेटा बदलते समय फिर से चला जाता है (इस प्रकार कैनवास को फिर से चित्रित करता है) –

उत्तर

5

यह काम करता है:

var Shapes = new Meteor.Collection('shapes') 

if (Meteor.is_client) { 
    // Function that redraws the entire canvas from shapes in Meteor.Collection 
    function drawShapes() { 
    var shapes = Shapes.find({}) 
    shapes.forEach(function(shape) { 
     // draw each on canvas 
    }) 
    } 

    var startUpdateListener = function() { 
    // Function called each time 'Shapes' is updated. 
    var redrawCanvas = function() { 
     var context = new Meteor.deps.Context() 
     context.on_invalidate(redrawCanvas) // Ensures this is recalled for each update 
     context.run(function() { 
     drawShapes() 
     }) 
    } 
    redrawCanvas() 
    } 

    Meteor.startup(function() { 
    startUpdateListener() 
    }) 
} 
+1

यह काम करता है - धन्यवाद! हालांकि मैं व्यक्तिगत रूप से जो खोज रहा हूं वह केवल स्टार्टअप पर पूर्ण रेड्रा करना है - और फिर अपडेट/जोड़ा/हटाए गए पर केवल वृद्धिशील रेड्रो करें। क्या आप इस तरह की चीज को स्टार्टअप/रेंडर पर करने का सही तरीका है और हर अपडेट के बाद नहीं? यदि आप टेम्पलेट के अंदर प्रश्न पूछते हैं। प्रस्तुत किया गया यह काम नहीं कर रहा है। – semateos

+1

कारण मैंने पूर्ण रेड्रा किया है कि कैनवास व्यक्तिगत आकार को हटाने/अपडेट करने का समर्थन नहीं करता है। AFAIK, यदि आकार ओवरलैप आकार देता है, तो आपको पूरे कैनवास को फिर से निकालना होगा। – 7zark7

+0

@ सैमेटोस आप Pixi.js जैसी लाइब्रेरी का उपयोग करके उस व्यवहार को प्राप्त कर सकते हैं, जो फ्लैश डिस्प्ले सूची की नकल करता है। –

7

शायद आपके प्रश्न का उत्तर Collection.observe (http://docs.meteor.com/#observe) का उपयोग करना है और विभिन्न कॉलबैक में प्रासंगिक रीड्रॉइंग कोड को ट्रिगर करना है।

उदाहरण के लिए, कुछ की तरह:

Rectangles.observe({ 
    added: function(rect) { 
    var g = canvas.getContext('2d'); 
    g.fillRect(rect.x, rect.y, rect.w, rect.h); 
    }, 
    // etc 
}) 
+0

धन्यवाद दोस्त, उसे नहीं देखा।मेरे विशेष मामले में एक समस्या यह है कि मुझे पूरे कैनवास को फिर से निकालना होगा (उदाहरण के लिए आयत को हटाने के लिए आयत को फिर से निकालना आवश्यक है), जिसका अर्थ है कि मुझे पूरे क्वेरी परिणामों की आवश्यकता है, न केवल जोड़ा/हटाया/बदला गया। – 7zark7

+0

निश्चित रूप से। मुझे लगता है कि आपके पास ऐसा करने का सही तरीका है। मेरी इच्छा है कि मेटियर के पास एक संदर्भ स्थापित करने का एक आसान तरीका था + रास्ते से अमान्यता के साथ सौदा। –

संबंधित मुद्दे

 संबंधित मुद्दे