Label标签中使用dialog text失效
Qyq777 opened this issue · 4 comments
现在Label创建之后赋值带dialog的text会无效;
//创建时参入的dialog text有效
const lab = $.CreatePanel('Label', p, '', { 'text': 'Welcome {s:name}' })
lab.SetDialogVariable('name', 'aaa')
//后续对text赋值的dialog text无效
const lab = $.CreatePanel('Label', p, '', { 'text': 'Welcome {s:name}' })
lab.text = 'Welcome {s:name2}'
lab.SetDialogVariable('name2', 'aaa')
//发现可以使用SetAlreadyLocalizedText函数设置文本后dialog生效
const lab = $.CreatePanel('Label', p, '', { 'text': 'Welcome {s:name}' })
lab.SetAlreadyLocalizedText('Welcome {s:name2}')
lab.SetDialogVariable('name2', 'aaa')
感谢你的建议,我今天测试了一下SetAlreadyLocalizedText
,效果的确不错,所以我发布了一个版本,然后应用在我的项目内发现这个方法无法渲染html标签,也就是如果文本内带有<font>
标签渲染颜色,那么不会渲染出来,即使已经设置了html
为true,所以我回滚了这个更新。
如果你需要通过父节点来更新文本中的变量,目前还是建议通过手动创建的方式,或者直接把vars
写在Label
里面。
我再测试了一下SetAlreadyLocalizedText
,可能是内部把html关掉了,我设置了html
为true,在把text
赋值给text
就可以重新渲染出来,但是这样会失去自动更新变量的功能,目前来说无解。
可以在createElement
函数中将text
传入$.CreatePanel
吗,因为现在text
被解构出来,通过后续赋值设置lab.text
属性,会导致dialog无法生效,以及目前发现创建<RadioButton/>
组件如果不传入text
也会导致丢失<Label/>
子节点。
所以我目前的方法是在createElement
在将text
作为原生属性传入$.CreatePanel
,然后记录text
到lab.__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
我想到了一个办法还需测试一下。