robincodex/solid-panorama

Label标签中使用dialog text失效

Qyq777 opened this issue · 4 comments

Qyq777 commented

现在Label创建之后赋值带dialog的text会无效;

//创建时参入的dialog text有效
const lab = $.CreatePanel('Label', p, '', { 'text': 'Welcome {s:name}' })
lab.SetDialogVariable('name', 'aaa')

image

//后续对text赋值的dialog text无效
const lab = $.CreatePanel('Label', p, '', { 'text': 'Welcome {s:name}' })
lab.text = 'Welcome {s:name2}'
lab.SetDialogVariable('name2', 'aaa')

image

//发现可以使用SetAlreadyLocalizedText函数设置文本后dialog生效
const lab = $.CreatePanel('Label', p, '', { 'text': 'Welcome {s:name}' })
lab.SetAlreadyLocalizedText('Welcome {s:name2}')
lab.SetDialogVariable('name2', 'aaa')

image

感谢你的建议,我今天测试了一下SetAlreadyLocalizedText,效果的确不错,所以我发布了一个版本,然后应用在我的项目内发现这个方法无法渲染html标签,也就是如果文本内带有<font>标签渲染颜色,那么不会渲染出来,即使已经设置了html为true,所以我回滚了这个更新。

如果你需要通过父节点来更新文本中的变量,目前还是建议通过手动创建的方式,或者直接把vars写在Label里面。

我再测试了一下SetAlreadyLocalizedText,可能是内部把html关掉了,我设置了html为true,在把text赋值给text就可以重新渲染出来,但是这样会失去自动更新变量的功能,目前来说无解。

Qyq777 commented

可以在createElement函数中将text传入$.CreatePanel吗,因为现在text被解构出来,通过后续赋值设置lab.text属性,会导致dialog无法生效,以及目前发现创建<RadioButton/>组件如果不传入text也会导致丢失<Label/>子节点。

所以我目前的方法是在createElement在将text作为原生属性传入$.CreatePanel,然后记录textlab.__solidText,后续的text更新时用__solidText比较新text,变更了才设置lab.text=xxx,如果lab.html没开启时,就可以SetAlreadyLocalizedText代替lab.text=xxx

所以现在只有当同时用到了html和dialog,且需要动态变更text,这种情况在text变更后会导致dialog失效,所以我的写法是将标签创建放在effect里,更新后会创建新的元素使其生效。

<Panel>
    {
        <Label
            html={true}
            text={`<font color="${color()}">name={d:name}</font>}`}
            vars={{
                name: name()
            }}
        />
    }
</Panel>

这些我在Fork上修改后小测了功能可以,还没发现啥其他问题,不知道考虑是否有遗漏哈哈,如有问题可以告诉我

@Qyq777 说多了都是泪,最初是直接将text传入$.CreatePanel,这对于不更改text的Label是没问题的,一旦要动态改变text就会发生文本内变量没有自动变更,所以后面才加入了__solidText的缓存字段,这也是一种迫不得已的做法,对于SetAlreadyLocalizedText我想到了一个办法还需测试一下。