smalljs$mol搜索⌘ K文档演练场对比生态系统关于ZH
故障排查Getting Started介绍心智模型快速上手从 TypeScript 到 view.tree项目结构工具链Essentials安装视图状态与响应式路由渲染测试部署故障排查Data数据获取数据模式Giper BazaMore展示来自 React、Vue 和 Svelte食谱Advanced插件模块元数据离线幽灵视图About常见问题团队发布API$mol_button_major$mol_button_minor$mol_string$mol_number$mol_text$mol_paragraph$mol_list$mol_row$mol_link$mol_check$mol_switch$mol_select$mol_scroll$mol_page$mol_pick

故障排查

本页每一条的形状都一样:构建是绿的,审计是干净的,控制台一声不吭,而屏幕要么空着,要么不是你想要的样子。编译器看不见这些错误,因为每一个都是合法的程序,只不过它描述的是另一个组件。找到那条读起来像你眼前现象的标题,下面就是原因和修法。

我覆盖了属性却没有任何效果,也不报错

view.tree 里的名字和类里方法的名字不一致,最常见的是大小写:树里写 exchange_form,类里写 exchangeForm。这是两个属性。类里的那个永远不会被调用,树里的那个保持默认值,而且没有任何东西会把这件事报出来。名字处处都是 snake_case,而且必须逐字母一致。改过 .view.ts 之后,请检查每一处覆盖是否仍然对应一个存在的属性;树旁边生成的 -view.tree/*.view.tree.d.ts 就是用来比对的清单。

输入框要设置 placeholder、禁用状态或输入类型

这些都是 $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 会丢掉 disabledroletabindex。用 ^ 开头来继承,然后再加你自己的键: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,它会替你做这个判断。

循环订阅

某个 @ $mol_mem 方法写了另一个单元,或者做了副作用,结果让它读过的东西失效了。计算只读取和返回;写入、网络、定时器和 DOM 属于 @ $mol_action 处理器。同一条消息的另一个来源,是对某个子节点的 <=> 绑定,加上类里一个转发给同一个子节点的方法,下一条就说这个。

Maximum call stack 调用栈溢出

有两种形状会导致它。第一种,树里给子节点写了 tab? <=> tab?,而类里写了 tab() { return this.Head().tab() }:子节点问所有者,所有者又问子节点。去掉指向你所转发的那个子节点的 <=>第二种,某个子视图被重新指定成了你自己的类,而类在树里列出的某个属性上调用了 super。那个 super 并不是基类的实现,而是树为这条绑定生成的存根,而存根又转发回所有者。请显式地转发给原本的实现,见下面关于重新指定类型的那一条。

大写开头的值无法从 TypeScript 覆盖

<= Label* \ 生成的方法叫 Label,而类里的 label() 是另一个方法。子视图首字母大写,值首字母小写,树里的大小写决定了生成方法的名字。

嵌套列表的每一行都显示同一条数据

在 GitHub 上编辑此页这有帮助吗?上一页部署下一页数据获取
本页内容我覆盖了属性却没有任何效果,也不报错输入框要设置 placeholder、禁用状态或输入类型一个词被拆成一个个字母渲染出来屏幕是空的,测试却是绿的数据永远加载不出来,组件卡在加载状态循环订阅Maximum call stack 调用栈溢出大写开头的值无法从 TypeScript 覆盖嵌套列表的每一行都显示同一条数据我改了子视图的类,它的内容就消失了子类上找不到基础组件 view.ts 里的方法声明在同一个 view.tree 文件里的基类丢了自己的行为样式在子视图和它内部的组件之间串了针对 false 属性的选择器永远匹配不上样式里写了数字却毫无变化滚动视图的两个子节点叠在了一起minimal_height 看不出任何效果嵌入的组件把页面撑得左右滚动第三方 CSS 对我的组件不起作用点击指向当前页面的链接反而清空了 URL我的输入处理器每次渲染都会执行我在 value 的 setter 里抛出的错误从来不显示带键的处理器绑定被报告为缺失打包结果里出现了我从未用过的模块下一步
Type to search the documentation.