एक छोटा सा ऐप्लिकेशन में मैं इमारत का उपयोग करता है अभिकर्मक और फिर से फ्रेम मैं प्रेषण करने के लिए जो पेज एप्लिकेशन राज्य में एक मूल्य के आधार पर दिखाया जाना चाहिए बहु तरीकों का उपयोग कर रहा हूँ कर रहा हूँ:रीगेंट/री-फ्रेम के लिए फ़ंक्शन के रूप में बहु-विधियां क्यों काम नहीं कर रही हैं?
(defmulti pages :name)
(defn main-panel []
(let [current-route (re-frame/subscribe [:current-route])]
(fn []
;...
(pages @current-route))))
और फिर मैं जैसे तरीकों:
(defmethod layout/pages :register [_] [register-page])
जहां register-page
समारोह वास्तविक दृश्य उत्पन्न होगा:
(defn register-page []
(let [registration-form (re-frame/subscribe [:registration-form])]
(fn []
[:div
[:h1 "Register"]
;...
])))
मैंकी कोशिश की, जैसा कि:
(defmethod layout/pages :register [_]
(let [registration-form (re-frame/subscribe [:registration-form])]
(fn []
[:div
[:h1 "Register"]
;...
])))
और इससे कोई पृष्ठ कभी भी प्रस्तुत नहीं किया गया। अपने मुख्य पैनल में मैं changed the call to pages
to square brackets ताकि अभिकर्मक दृश्यता इसे में होगा:
(defn main-panel []
(let [current-route (re-frame/subscribe [:current-route])]
(fn []
;...
[pages @current-route])))
और उस वजह से पहले का दौरा किया पेज काम करने के लिए, लेकिन उसके बाद, लिंक पर क्लिक करने (जो वर्तमान मार्ग बदलने के लिए कारण बनता है) नहीं है प्रभाव।
व्यक्तिगत विधियों को परिभाषित करने वाले सभी नामस्थानों को पहले लोड किया गया फ़ाइल में आवश्यक है, जिसमें init फ़ंक्शन शामिल है, और तथ्य यह है कि मैं कोई भी पृष्ठ चुन सकता हूं और यह प्रदर्शित करता है कि कोड लोड हो रहा है (फिर, स्विचिंग के लिए एक और पेज काम नहीं करता है):
(defn about-page []
(fn []
[:div "This is the About Page."]))
(defmethod layout/pages :about [_]
[about-page])
(defmethod layout/pages :about2 [_]
(fn []
[:div "This is the About 2 Page."]))
:
https://github.com/carouselapps/ninjatools/blob/master/src/cljs/ninjatools/core.cljs#L8-L12
के प्रयास में डिबग करने के लिए क्या हो रहा है, मैं दो मार्गों, :about
और :about2
, एक समारोह के रूप में एक और एक विधि के रूप एक परिभाषित
और pages
पर कॉल करने के परिणाम को लेआउट प्रिंट किया (पाठ्यक्रम के वर्ग ब्रैकेट के बजाय स्पष्ट कॉल का उपयोग करना था)। लिपटे समारोह, एक है कि काम करता है, रिटर्न:
[#object[ninjatools$pages$about_page "function ninjatools$pages$about_page(){
return (function(){
return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"div","div",1057191632),"This is the About Page."], null);
});
}"]]
जबकि विधि रिटर्न:
#object[Function "function(){
return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"div","div",1057191632),"This is the About 2 Page."], null);
}"]
मैं विधि बदलते हैं होने के लिए:
(defmethod layout/pages :about2 [_]
[(fn []
[:div "This is the About 2 Page."])])
है कि, लौट एक वेक्टर में कार्य, फिर, यह काम करना शुरू कर देता है।
(defn about-page []
(fn []
[:div "This is the About Page."]))
(defmethod layout/pages :about [_]
about-page)
के रूप में अभिकर्मक के वाक्य रचना [function]
है लेकिन यह समारोह स्वचालित रूप से फोन करने वाला था भावना का एक सा बनाता है: और अगर मैं लिपटे कार्य करने के लिए रिवर्स परिवर्तन करना है, यह विधि के रूप में एक ही तरीके से विफल शुरू होता है ।
मैं भी में के रूप में ब्राउज़र के लिए @current-route
outputting, शुरू कर दिया:
[:main.container
[alerts/view]
[pages @current-route]
[:div (pr-str @current-route)]]
और मैं सत्यापित @current-route
सही ढंग से संशोधित किया जा रहा है और उत्पादन अपडेट किया, बस [pages @current-route]
नहीं।
मेरी अनुप्रयोग के लिए पूर्ण स्रोत कोड यहां पाया जा सकता: https://github.com/carouselapps/ninjatools/tree/multi-methods
Update: corrected the arity of the methods following Michał Marczyk's answer.
क्या आपको उन नामस्थानों की आवश्यकता है जहां आप कुछ रूट नेमस्पेस में 'defmethod' का उपयोग करते हैं? क्योंकि यदि आपको उन नामस्थानों की स्पष्ट रूप से आवश्यकता नहीं है, तो आपकी विधियां आसानी से multimethod में नहीं जुड़ती हैं। – skrat
@skrat हां। मैं इस बात को ध्यान में रखकर प्रश्न संपादित करूंगा। – Pablo
इसे डीबग करने के लिए मैं 1 होगा। एक डिफ़ॉल्ट विधि जोड़ें और 2. प्रिंट करें कि multimethod क्या लौट रहा है (शायद शून्य)। – PeakCode