Archived
feat(interaction): data-options —— 下拉的选项从台账现读
芯片类型是人在件上现造的,写死在模版里等于「只能选出包那天就有的那几种」。 与 data-rows 同一层机制:只取值不判断,选中哪一个仍由 selectCurrent 按行内的值定。 空选项一律留着 ——「还没选」得说得出来。 brief 给的实现有两处会让测试落空,已按 TDD 修正并留痕在代码注释里: ①产出的 <select> 若留着 data-slot,renderTemplate 的 SLOT 规则会把整段 <option> 当文本槽冲掉(<select>2</select>)—— fillOptions 需要把 data-slot 一并摘掉; ②selectCurrent 只在 renderRows 的逐行流程里被调用,不在任何 data-rows 里的下拉 永远等不到人给它标 selected —— renderView 收尾再兜底调一遍(用外层作用域), 已经被行内定过的整块原样放过(靠判断块内是否已有 selected,不靠字符串层面 分不清的「是不是在行里」)。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LKMZDwMbyKzjw6Hembwvet
This commit is contained in:
@@ -435,3 +435,46 @@ describe('嵌套行模版与 data-by —— 一个候选一张表', () => {
|
||||
expect(all.split('使能逻辑').length - 1).toBe(2);
|
||||
});
|
||||
});
|
||||
|
||||
describe('data-options:下拉的选项从台账现读', () => {
|
||||
const scope = {
|
||||
'parts.chip_type': [
|
||||
{ type_id: 1, type_name: 'DC-DC 降压稳压器' },
|
||||
{ type_id: 2, type_name: 'LDO 线性稳压器' },
|
||||
],
|
||||
chip_type_id: 2,
|
||||
};
|
||||
|
||||
it('把选项铺进去,并留一个空选项(「还没选」要说得出来)', () => {
|
||||
const html = '<select data-col="chip_type_id" data-slot="chip_type_id" data-options="parts.chip_type" data-option-value="type_id" data-option-label="type_name"></select>';
|
||||
const out = renderView(html, scope);
|
||||
expect(out).toContain('<option value=""></option>');
|
||||
expect(out).toContain('<option value="1">DC-DC 降压稳压器</option>');
|
||||
expect(out).toContain('<option value="2" selected>LDO 线性稳压器</option>');
|
||||
});
|
||||
|
||||
it('选项文字要转义 —— 台账里的值是人填的', () => {
|
||||
const out = renderView(
|
||||
'<select data-col="c" data-slot="c" data-options="t.t" data-option-value="v" data-option-label="l"></select>',
|
||||
{ 't.t': [{ v: 'x', l: '<b>坏</b>' }], c: '' },
|
||||
);
|
||||
expect(out).toContain('<b>坏</b>');
|
||||
expect(out).not.toContain('<b>坏</b>');
|
||||
});
|
||||
|
||||
it('地址取不到 → 只留那个空选项,不塞假数据(界面不撒谎)', () => {
|
||||
const out = renderView('<select data-col="c" data-options="nope.nope" data-option-value="v" data-option-label="l"></select>', {});
|
||||
expect(out).toContain('<option value=""></option>');
|
||||
expect(out).not.toContain('undefined');
|
||||
});
|
||||
|
||||
it('行内的下拉:每一行都铺同一份选项,选中的按各行自己的值', () => {
|
||||
const html =
|
||||
'<tbody data-rows="mine:a.b" data-edit="a.b">' +
|
||||
'<tr><select data-col="chip_type_id" data-slot="chip_type_id" data-options="parts.chip_type" data-option-value="type_id" data-option-label="type_name"></select></tr>' +
|
||||
'</tbody>';
|
||||
const out = renderView(html, { ...scope, 'mine:a.b': [{ chip_type_id: 1 }, { chip_type_id: 2 }] });
|
||||
expect(out.match(/<option value="1">DC-DC 降压稳压器<\/option>/g)).toHaveLength(1);
|
||||
expect(out.match(/<option value="1" selected>DC-DC 降压稳压器<\/option>/g)).toHaveLength(1);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user