هر مدخلِ این صفحه یک شکل دارد: ساخت سبز است، ممیزی تمیز است، کنسول ساکت است، و صفحه یا خالی است یا آن چیزی نیست که میخواستید. کامپایلر این اشتباهها را نمیبیند چون هرکدامشان برنامهای درستاند که اتفاقاً کامپوننتِ دیگری را توصیف میکنند. عنوانی را پیدا کنید که شبیهِ چیزی است که میبینید؛ زیرش علت و راهحل آمده است.
نامِ درونِ view.tree و نامِ متد در کلاس فرق دارند، بیشتر وقتها در بزرگی و کوچکیِ حروف: exchange_form در درخت، exchangeForm در کلاس. اینها دو ویژگیاند. آنکه در کلاس است هرگز صدا زده نمیشود، آنکه در درخت است پیشفرضش را نگه میدارد، و هیچچیز گزارشش نمیکند.نامها همهجا snake_caseاند و باید حرفبهحرف یکی باشند. بعد از ویرایشِ یک .view.ts بررسی کنید که هر بازنویسی هنوز نامِ ویژگیای موجود را میبرد؛ فایلِ تولیدشدهٔ -view.tree/*.view.tree.d.ts کنارِ درخت همان فهرستی است که باید با آن مقایسه کنید.
اینها ویژگیهای $mol_stringاند: hint برای placeholder، enabled برای وضعیتِ غیرفعال، type برای نوعِ ورودی. همانجا که ورودی استفاده میشود تنظیمشان کنید:1<= Password $mol_string2 hint \Password3 type \password4 enabled <= can_edit true5 value?<=> password?\هر ویژگیِ دیگری از هر کامپوننتِ دیگری به همین شکل پیدا میشود: فایلِ .view.treeاش را باز کنید، همانطور که چطور منبعها را بخوانیم نشان میدهد.attr* برای ویژگیهای واقعیِ DOM است که کامپوننت از پیش مدلشان نکرده، و تلهٔ خودش را دارد: بلوکی که خطِ اولش ^ نباشد کلِ دیکشنریِ ویژگیهای پایه را جایگزین میکند، پس $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 استفاده کنید که همین بررسی را برایتان انجام میدهد.