2015-09-30 4 views
8

मेरी पहली घटना पर मैं एक एमबॉक्स संवाद खोलूंगा। एमबॉक्स बूटबॉक्स के लिए एक प्रकार का विस्तार है, जो एक मॉडल दिखाने के लिए है। मुझे मॉडेल सामग्री के रूप में एक और टेम्पलेट का उपयोग करने के लिए mbox की आवश्यकता है।बंद मोडल जो किसी अन्य ईवेंट फ़ंक्शन में बनाया गया है

तो मोडल में createElement-Template की सामग्री से लोड किया जाएगा। यदि उपयोगकर्ता ने कुछ इनपुट परिवर्तन किए हैं तो मोडल बंद होना चाहिए। इसलिए modal("hide") फ़ंक्शन है। लेकिन bbox को पहले टेम्पलेट-ईवेंट में सेट किया गया है और मॉडल का समापन दूसरे टेम्पलेट-ईवेंट में किया जाएगा, मुझे मोडल को बंद करने में समस्याएं आईं।

घटनाओं

Template.main.events({ 
    'submit form': function(event, template) { 
     event.preventDefault(); 

     var bbox = mbox.dialog({ 
      title: 'title', 
      message: Template.createElement 
     }); 
    } 
}); 

Template.createElement.events({ 
    'change input': function(event, template) { 
     bbox.modal('hide'); 
    } 
}); 

अद्यतन

ऊपर समस्या एक वैश्विक वर के साथ काम करता है। इसके लिए एडम के लिए धन्यवाद।

लेकिन मैं एक उल्का पैकेज में एक मॉडल को नष्ट नहीं करना चाहता, जिसे पैकेज द्वारा बनाया गया था। मैंने वैश्विक वैर का उपयोग करने की कोशिश की और मैंने api.export() का उपयोग करने की कोशिश की। लेकिन फिर भी यह काम नहीं करता है। मैंने सत्रों के साथ काम करने की भी कोशिश की।

पैकेज-ग्राफ/lib/ग्राहक/graph.js

var bbox; 
CanvasManager = { 
    onShowAddToolTip (element) { 
     bbox = mbox.dialog({ // <-- Create Modal 
      title: "Title", 
      message: Template.search, // <-- Loading Template search with just one input field with typeahead 
     }); 
    }, 
} 

CanvasManger.create(...); 

पैकेज-ग्राफ/lib/package.js

api.export('bbox'); 

दूसरा पैकेज एक Typeahead-खोज बॉक्स प्रदान (sergeyt:typeahead)। पहले पैकेज में मोडल बना कर, खाका मोडल (helloludger:mbox) में लोड किया जाएगा। अब उपयोगकर्ता Typeahead के माध्यम से खोज और किसी आइटम का चयन कर सकते हैं। चयन के बाद मॉडल `मोडल ('छिपाएं') द्वारा नष्ट कर दिया जाना चाहिए।

पैकेज-खोज/lib/ग्राहक/events.js

Template.searchMain.onRendered(function() { 
    Meteor.typeahead.inject(); 
}); 

पैकेज-खोज/lib/ग्राहक/helper.js

Template.search.helpers({ // <-- getting the data for the input typeahead 
    searchData: function() { 
     return [ 
      { 
       name: 'cat1', 
       valueKey: 'title', 
       displayKey: 'title', 
       header: '<h3 class="category-name">Category</h3>', 
       template: 'searchResults', 
       local: function() { 
        return Collection.find().fetch(); 
       } 
      } 
     ] 
    }, 
    selected: function(event, suggestion) { // <-- by selecting an item, I can process the data and remove the modal 
      // do something 
      bbox.modal('hide'); // <!-- destroy modal 
      return; 
     } 
    } 
}); 
+0

क्या आप HTML पोस्ट भी कर सकते हैं? उल्का में आप Template.instance() के माध्यम से टेम्पलेट आवृत्ति पर राज्य वस्तुओं को साझा और एक्सेस कर सकते हैं। –

+0

यदि आप बॉक्स के सामने var को हटाते हैं तो आप इसे फ़ाइलों में एक्सेस करने में सक्षम होना चाहिए। Var bbox बदलने का प्रयास करें; bbox = null; –

उत्तर

8

bbox एक वैश्विक चर करें:

var bbox; 
Template.main.events({ 
    'submit form': function(event, template) { 
     event.preventDefault(); 

     bbox = mbox.dialog({ 
      title: 'title', 
      message: Template.createElement 
     }); 
    } 
}); 

Template.createElement.events({ 
    'change input': function(event, template) { 
     bbox && bbox.modal('hide'); 
    } 
}); 
+0

क्यों 'bbox && ...'? – user3142695

+4

@ user3142695 - आपको इस बात की कोई गारंटी नहीं है कि इस बिंदु पर 'bbox' सेट किया गया है (यह अभी भी' अपरिभाषित 'हो सकता है)। 'bbox && do कुछ()' 'if (bbox) {doSomething()}' कहने जैसा ही है, बस एक जावास्क्रिप्ट शॉर्टंड – Adam

+0

मैंने वैश्विक var का उपयोग करने का प्रयास किया, जो पहले उदाहरण के लिए काम करता है। लेकिन पैकेजों के साथ काम करने के मामले में मुझे एक ही चीज़ के साथ समस्या है। मैंने इसे और अधिक स्पष्ट करने के लिए पोस्ट को अपडेट किया। कृपया इसे देखें। – user3142695

1

यकीन है कि दूसरे पैकेज पहले पर एक निर्भरता है बनाओ:

api.use('first-package') 

निर्भरता से केवल निर्यात उपलब्ध हैं।

RelevantMeteordocs

2

ऐसा मत करो - it violates software engineering principles.

कारण आप एक समाधान खोजने के लिए संघर्ष किया है एक मजबूत संकेत है कि यह आपके एप्लिकेशन की संरचना करने के लिए एक अच्छा तरीका नहीं है।

  • आप पैकेजबॉक्स एम्बेड करने के लिए पैकेजबॉक्स चाहते हैं, जिसका मतलब है कि पैकेजबॉक्स पैकेज पर निर्भर करता है।

  • और तुम packageTypeAhead packageMBox में पहुंच सकते हैं और इसे नियंत्रित, की आवश्यकता होती है (धन्यवाद Gaelan) कि packageTypeAhead packageMBox पर निर्भर करना चाहते हैं।

यह द्विदिश युग्मन है, और आप आप क्या हासिल था कि यह काम करने के लिए, एक रास्ता खोजने भले ही? आपके पास दो पैकेज हैं, जिनमें से कोई भी स्वतंत्र रूप से उपयोग नहीं किया जा सकता है (या यहां तक ​​कि ठीक से परीक्षण भी किया जा सकता है)।

तो समाधान है: दो पैकेजों को एक पैकेज में मिलाएं

'Package for everything' आपके ऐप को व्यवस्थित करने का एक अच्छा तरीका है, लेकिन यह विचार करना महत्वपूर्ण है कि आप कार्यक्षमता को कैसे और कहाँ विभाजित करते हैं ताकि आप शुरू करने से अधिक समस्याएं न बना सकें।

0

यदि आप वैश्विक चर के साथ हैक करने जा रहे हैं, तो आप अपने mbox के साथ भी हैक कर सकते हैं।

mbox.myModal = mbox.dialog({ 
    title: 'title', 
    message: Template.createElement 
}); 

और फिर पैकेज-खोज/lib/ग्राहक में/helper.js

Template.search.helpers({ 
    ... 
    selected: function(event, suggestion) { 
      mbox.myModal && mbox.myModal.modal('hide'); 
      mbox.myModal = null; 
      return; 
     } 
    } 
}); 

आदर्श रूप में, हालांकि, आप अपने खुद के तीसरे स्वतंत्र अपने दो संकुल के बीच संवाद मॉड्यूल बनाने होता है, और इंजेक्षन कि दोनों पैकेजों में। इस तरह वे युग्मित नहीं हैं और दोनों राज्य साझा कर सकते हैं।

इस साझा मॉड्यूल में, आपको केवल एक सेटटर और गेटर फ़ंक्शन चाहिए जो आपके मोडल इंस्टेंस को रखता है। मैं उल्का से परिचित नहीं हूं इसलिए मुझे यकीन नहीं है कि आप ऐसा करने जा रहे हैं, लेकिन जो आपने पहले ही लिखा है उसके आधार पर निर्णय लेना संभव है।

अगर आप इसके माध्यम से काम करना चाहते हैं तो एक टिप्पणी जोड़ें।

+0

मैं इसे इस तरह से करना चाहता हूं। क्या आप मुझे कुछ कोड उदाहरण दे सकते हैं? – user3142695

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

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