এই পৃষ্ঠার প্রতিটি ভুক্তির আকৃতি একই: বিল্ড সবুজ, অডিট পরিষ্কার, কনসোল চুপ, আর স্ক্রিন হয় খালি নয়তো যা চেয়েছিলেন তা নয়। কম্পাইলার এই ভুলগুলো দেখতে পায় না, কারণ প্রতিটিই বৈধ প্রোগ্রাম — শুধু সেটি অন্য একটি কম্পোনেন্ট বর্ণনা করে। আপনি যা দেখছেন তার সঙ্গে মেলে এমন শিরোনামটি খুঁজুন; তার নিচে কারণ ও সমাধান আছে।
view.tree-এর নাম আর ক্লাসের মেথডের নাম আলাদা, বেশিরভাগ সময় ছোট-বড় হাতের অক্ষরে: ট্রি-তে exchange_form, ক্লাসে exchangeForm। এ দুটি আলাদা প্রপার্টি। ক্লাসেরটি কখনো ডাকা হয় না, ট্রি-এরটি তার ডিফল্ট ধরে রাখে, আর কিছুই এ কথা জানায় না।নাম সর্বত্রই snake_case এবং অক্ষরে অক্ষরে মিলতে হবে। কোনো .view.ts সম্পাদনার পর দেখে নিন, প্রতিটি ওভাররাইড এখনো বিদ্যমান কোনো প্রপার্টির নামই বলছে কি না; ট্রি-এর পাশে জেনারেট হওয়া -view.tree/*.view.tree.d.ts ফাইলটিই মিলিয়ে দেখার তালিকা।
এগুলো $mol_string-এর প্রপার্টি: প্লেসহোল্ডারের জন্য hint, নিষ্ক্রিয় অবস্থার জন্য enabled, ইনপুটের ধরনের জন্য type। যেখানে ইনপুটটি ব্যবহার হচ্ছে সেখানেই সেট করুন:1<= Password $mol_string2 hint \Password3 type \password4 enabled <= can_edit true5 value?<=> password?\অন্য যেকোনো কম্পোনেন্টের অন্য যেকোনো প্রপার্টিও একইভাবে পাওয়া যায়: তার .view.tree খুলুন, যেমনটি সোর্স কীভাবে পড়বেন দেখায়।কম্পোনেন্ট যেসব প্রকৃত DOM অ্যাট্রিবিউট আগে থেকে মডেল করে না, attr* সেগুলোর জন্য, আর এর নিজস্ব একটি ফাঁদ আছে: প্রথম লাইনে ^ নেই এমন একটি ব্লক বেসের গোটা অ্যাট্রিবিউট ডিকশনারিটাই প্রতিস্থাপন করে, ফলে এভাবে লেখা $mol_button তার disabled, role ও tabindex হারায়। উত্তরাধিকার পেতে ব্লকটি ^ দিয়ে শুরু করুন, তারপর নিজের কী যোগ করুন:1attr *2^3 data_kind \primary
যেখানে লিস্ট প্রত্যাশিত সেখানে স্ট্রিং দেওয়া হয়েছে, আর স্ট্রিংটি অক্ষরে অক্ষরে ছড়িয়ে গেছে। স্ট্রিং শুরু হয় \ দিয়ে, লিস্ট শুরু হয় / দিয়ে। সাধারণ ঘটনাটি sub নিয়ে, যেটি একটি লিস্ট:1sub /<= label \Hello
একটি ওভাররাইড .view.ts থেকে খসে পড়েছে। ট্রি প্রতিটি প্রপার্টিকে একটি ডিফল্ট দেয়, তাই ক্লাস যখন আর rows() নতুন করে সংজ্ঞায়িত করে না, TypeScript সন্তুষ্ট থাকে আর লিস্টটি খালি রেন্ডার হয়। যে টেস্টগুলো শুধু মডেল যাচাই করে সেগুলো সবুজই থাকে, কারণ মডেল ঠিকই আছে।স্ক্রিন যে ওভাররাইডগুলোর ওপর নির্ভর করে, তাদের প্রত্যেকটির জন্য এমন টেস্ট লিখুন যা ব্যবহারকারী যা দেখে তা-ই পড়ে: rows(), sub(), সাব-ভিউয়ের title(), অথবা DOM। টেস্টিং দুটোই দেখায়।
কোনো @ $mol_mem মেথড তার মান হিসেবে একটি promise ফেরত দিয়েছে: fetch(uri).then(...), একটি async মেথড, কিংবা $mol_wire_async(this).load()-এর ফল। সেলের ভেতরে থাকা promise সবার কাছেই "এখনো গণনা চলছে" বলে পড়া হয়, আর সেটি রিজলভ হলে সেলটি পুনরায় গণনা হয়ে একটি টাটকা promise বানায়। নেটওয়ার্ক কাজ করে; ভিউ কখনো ফল দেখে না।সঠিক আকৃতিটি সিঙ্ক্রোনাস: সেলের ভেতরে this.$.$mol_fetch.json(uri) ডাকুন এবং পার্স করা মানটি ফেরত দিন। রেসপন্স না আসা পর্যন্ত ফাইবার সাসপেন্ড থাকে, তারপর সেলটি আবার চালায়, তাই আপনার কোডে promise কখনো দেখাই দেয় না। যেখানে অ্যাসিঙ্ক কাজ অন্য কোথাও করতেই হয়, সেখানে তার ফল আলাদা একটি স্টেট সেলে রাখুন আর ইফেক্টটি একটি ফ্ল্যাগ বা একটি কী ফেরত দিক, কখনোই promise নয়।দ্বিতীয় কারণ হলো গিলে ফেলা ত্রুটি: সেলের ভেতরে এমন try/catch, যা আসল ব্যর্থতার সঙ্গে সাসপেনশনটাকেও ধরে ফেলে। যা Promise, তা পুনরায় থ্রো করুন, অথবা $mol_fail_catch ব্যবহার করুন — এটি আপনার হয়ে এই যাচাইটি করে।