$mol
搜索
⌘ K
文档
演练场
对比
生态系统
关于
ZH
故障排查
Getting Started
介绍
心智模型
快速上手
从 TypeScript 到 view.tree
项目结构
工具链
Essentials
安装
视图
状态与响应式
路由
渲染
测试
部署
故障排查
Data
数据获取
数据模式
Giper Baza
More
展示
来自 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_string
2
hint
\Password
3
type
\password
4
enabled
<=
can_edit
true
5
value
?
<=>
password
?
\
任何其他组件的任何其他属性都用同样的方式找到:打开它的
.
view
.
tree
,正如
如何阅读源码
所示。
attr
*
是给组件本身没有建模的真实 DOM 属性用的,它自己也有个坑:一个不以
^
开头的块会整个替换掉基类的属性字典,于是这样写的
$mol_button
会丢掉
disabled
、
role
和
tabindex
。用
^
开头来继承,然后再加你自己的键:
1
attr
*
2
^
3
data_kind
\primary
一个词被拆成一个个字母渲染出来
在期待列表的地方传了一个字符串,于是字符串被逐字符铺开了。字符串以
\
开头,列表以
/
开头。最常见的情形是
sub
,它是一个列表:
1
sub
/
<=
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.