Egret社区
1银子
我用eui的list实现大概如下的一个列表:

道具1   合成需要(木材 3/3)   道具1有多厉害巴拉巴拉
道具2   合成需要(铁片 2/3)   道具2有多厉害巴拉巴拉
道具3   合成需要(木材 3/10)   道具3有多厉害巴拉巴拉
……

我需要在传入数据,生成列表时,如果合成的材料已经足够了,则把合成材料的字色标绿,如下图所示,改如何实现呢?

道具1   合成需要(木材 3/3)   道具1有多厉害巴拉巴拉
道具2   合成需要(铁片 2/3)   道具2有多厉害巴拉巴拉
道具3   合成需要(木材 3/10)   道具3有多厉害巴拉巴拉
……


拜谢各位大佬!

最佳答案

查看完整内容

1.list里有itemRender吧? itemRender在childrenCreated之后,你就可以对itemRender里的各个子元素进行处理了,比如你要求的改 变字体颜色. 2.根据你的条件, itemRender有个data属性,你初始化list时传入的数据就挂载在这个属性上. 这时你可以用这个数据里的值来判读需不需要变绿色. 比如你初始化时的数据,除了渲染需要的之外,额外加一个 isGreen:boolean 属性, 判读时读这个属性就可以了. 3 .把js 的引用类型和数值类型搞清了, 可以 ...
分享到 :
0 人收藏

7 个回复

倒序浏览
steven1041  自成一派 | 2019-1-8 00:09:48
1.list里有itemRender吧?  itemRender在childrenCreated之后,你就可以对itemRender里的各个子元素进行处理了,比如你要求的改 变字体颜色.
2.根据你的条件, itemRender有个data属性,你初始化list时传入的数据就挂载在这个属性上. 这时你可以用这个数据里的值来判读需不需要变绿色. 比如你初始化时的数据,除了渲染需要的之外,额外加一个 isGreen:boolean 属性, 判读时读这个属性就可以了.
3 .把js 的引用类型和数值类型搞清了, 可以解决很多问题.
SampleIz  登堂入室 | 2019-1-8 09:29:53
直接给你来段  伪代码  this.tips.textFlow = <Array<egret.ITextElement>>[
                                        { text: “天王盖地虎”, style: { "textColor": 0x92ffd0 } },
                                        { text: " 小鸡炖蘑菇" , style: { "textColor": 0xffffff } }
                                ];
kongao0204  登堂入室 | 2019-1-8 23:19:22
本帖最后由 kongao0204 于 2019-1-8 23:21 编辑
steven1041 发表于 2019-1-8 11:38
1.list里有itemRender吧?  itemRender在childrenCreated之后,你就可以对itemRender里的各个子元素进行处理 ...

首先感谢大神!我之前传进去的data里已经加了是否满足的字段,现在尝试了下,在childrenCreated里取不到data属性,是什么情况呢? 代码如下:

    protected childrenCreated():void
    {
        super.childrenCreated();
        console.log("-----------------------------")
        console.log(this.data.itemEnough)          //这一步会报错,提示值是null
        if  (this.data.itemEnough == 0) {
            this.itemName.textColor = 0x00ff00;
        }        
    }

虽然在这里取不到data的值,但是运行游戏又能正确的显示出传入的数据,可能会在哪一步出错了呢?
steven1041  自成一派 | 2019-1-9 10:45:17
childrenCreated了,但是数据还没转进来. 你在这里写个延迟30毫秒,就能取到了data了,或者下一帧再取数据
kongao0204  登堂入室 | 2019-1-9 13:03:04
steven1041 发表于 2019-1-9 10:45
childrenCreated了,但是数据还没转进来. 你在这里写个延迟30毫秒,就能取到了data了,或者下一帧再取数据 ...

非常感谢,回去试一试
kongao0204  登堂入室 | 2019-1-9 20:22:56
steven1041 发表于 2019-1-9 10:45
childrenCreated了,但是数据还没转进来. 你在这里写个延迟30毫秒,就能取到了data了,或者下一帧再取数据 ...

又看了一些资料,大致了解list这里的数据处理流程了,如果egret能有数据处理完的事件就好了。

这里写延迟比较容易,但总感觉不是很科学。有直接延迟一帧执行的指引吗?或者我先加一个每帧侦听的事件侦听,取了数据后再删除这个侦听?

    protected childrenCreated():void{
        super.childrenCreated();
        this.addEventListener(egret.Event.ENTER_FRAME,this.onEnterFrame,this)      
    }

    private onEnterFrame(){
               
                if (this.data.itemEnough){
               
                        this.addEventListener(egret.Event.ENTER_FRAME,this.onEnterFrame,this)                       
                if  (this.data.itemEnough == 1){
                                this.itemName.textColor = 0x00ff00;
                        }       
                }       
    }
steven1041  自成一派 | 2019-1-10 13:41:01
kongao0204 发表于 2019-1-9 20:22
又看了一些资料,大致了解list这里的数据处理流程了,如果egret能有数据处理完的事件就好了。

这里写延 ...

直接写30ms是不科学, 你用egret.callLater吧,  这时能取到itemrender.data. 你会发现childrencreated的时间和callLater的时间间隔,相差25ms左右
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|京网文[2014]0791-191号|京ICP证150115号|Egret社区 ( 京ICP备14025619号

Powered by Discuz! X3.2 © 2001-2019 Comsenz Inc.

返回顶部