我试图在关联数组中创建一堆回调函数,然后将其保存到另一个Scenegraph对象的接口字段中。
但是,当访问同一对象中的interface字段时,它指出该功能无效。
对象1:
callbacks = {
afterchildcreatecallback: function ()
print "THIS IS A CALLBACK FUNCTION"
return 1
end function
}
m.contentReader = createObject("roSGNode", "ContentReader")
m.contentReader.observeField("content", "setLists")
m.contentReader.contenturi = "pkg:/data/contentLists/" + settingFocused.id + "Data.xml"
m.contentReader.callbacks = callbacks
m.contentReader.control = "RUN"
对象2:
<component name = "ContentReader" extends = "Task" >
<script type = "text/brightscript" uri="pkg:/components/taskRunners/contentReader.brs"></script>
<interface>
<field id = "contenturi" type = "uri"></field>
<field id = "content" type = "node"></field>
<field id = "callbacks" type = "assocarray"></field>
</interface>
</component>
访问对象2中的回调字段时,我可以看到添加的对象,但是在其中定义的函数无效。
可以吗?还是我必须通过setter
方法传递函数?
答案 0 :(得分:1)
您不能在接口关联数组字段中存储函数。那是BrightScript的限制或设计功能。
如果要使用侦听器回调模式,仍可以通过callFunc()
使用接口函数来实现。
YourNode.xml
<component name="YourNode" extends="Node">
<interface>
<function name="myCallback"/>
</interface>
</component>
YourNode.brs
sub init()
m.contentReader = createObject("roSGNode", "ContentReader")
m.contentReader.listener = m.top
(...)
end sub
sub myCallback(params)
?"params "params
end sub
ContentReader.xml
<component name="ContentReader" extends="Task">
<interface>
(...)
<field id="listener" type="node"/>
</interface>
</component>
ContentReader.brs
sub onTaskDone()
params = ...
m.top.listener.callFunc("myCallback", params)
end sub
此外,请确保在完成使用后“释放”侦听器引用,您可以通过执行YourNode
从m.contentReader.listener = invalid
进行监听。这样可以避免循环引用引起的内存泄漏。