2016-12-20 31 views
3

roku/brightscript開發的新增功能:是否可以向全局關聯數組添加一個對象(可由所有組件訪問),該對象具有作爲其中一個屬性定義的方法並調用該方法?是否可以爲全局關聯數組屬性分配一個匿名函數?

Main.brs:

function Main() 
    init() 
end function 

function init()  
    screen = createObject("roSGScreen") 
    m.port = createObject("roMessagePort") 
    screen.SetMessagePort(m.port) 

    scene = screen.CreateScene("MainController") 
    screen.show() 

    o = { 
     getName: function() as string 
      return "John" 
     end function 
    } 

    setUpGlobal(screen) 
    m.global.addFields({mainMethods: o})   

    while(true) 
     msg = wait(0, m.port) 
     msgType = type(msg) 

     if msgType = "roSGScreenEvent" 
      if msg.isScreenClosed() then exit while 
     end if  
    end while   
end function 

function setUpGlobal(p_screen as Object) 
    m.global = p_screen.getGlobalNode() 
    m.global.id = "GlobalNode" 
end function 

..然後在另一個MainController,運行的任務並返回數據後...

MainController.brs

function init() 
    loadConfig() 
end function 


function loadConfig() 
    m.config = createObject("roSGNode", "Configurator") 
    m.config.observeField("done", "onConfigLoaded") 
    m.config.observeField("fail", "onConfigError") 
end function 


function onConfigLoaded() 
    print "config loaded: " + m.global.mainMethods.getName() 
end function 


function onConfigError() 
    print "config failed to loaded" 
end function 

當它擊中線MainController的16,我得到這個:

在BrightScript組件或界面中找不到成員函數。 (運行時錯誤& HF4)在 PKG:/components/MainController.brs(16)

這是什麼可以/不可以做只是一般的測試,所以請不要對是否對此有何評論是不是「好的做法」。我只想知道這是否可能,如果是這樣,我在這裏錯過了什麼?感謝您的幫助

回答

4

可以具有roAssociativeArray值的功能。事實上,這是在BrightScript中如何完成OO方法。

但是,您不能功能分配到Roku公司場景圖對象(roSgNode衍生產品)的領域!直接或間接(嵌套)。這是(當前?!)實現的限制。

你可以看到這裏RSG https://sdkdocs.roku.com/pages/viewpage.action?pageId=1608549

是支持的字段類型的列表,因此它說支持assocarray和(爲最近)array - 但有一個需要注意的到!當您在線程之間分配(或者甚至訪問)複合對象時,會進行深層複製,並且只有「受支持」類型才能完成複製對象 - 並且正如您所遇到的那樣,function不是其中之一。所有無法識別的數據目前都在悄悄丟棄,甚至沒有警告 - 所以買家要小心。

有關更多信息,請參見https://forums.roku.com/viewtopic.php?f=34&t=96955&p=541965#p541965。感受邀請您在Roku的開發者論壇中添加您的聲音,請求RSG支持功能類型 - 他們傾向於傾聽是否有足夠的人投訴。

+0

標記爲答案 - 感謝您的深入解釋!我會前往論壇...... :) – neoRiley

1

您無法在節點的字段中傳遞函數。只有數據。如果您在設置後立即檢查m.global.mainMethods.getName值,則該值無效。

+0

非常感謝 - 該文檔不說,這是在[getGlobalNode()文檔(https://sdkdocs.roku.com/display/sdkdoc/ifRoSGScreen#ifRoSGScreen-getGlobalNode()asroSGNode描述返回一個roSGNode對象) - 我猜混淆是出現在文檔說你可以在roAssociativeArray中賦值匿名函數的地方,然後在roSGNode的文檔中,它說它實現/支持ifAssociativeArray([roSGNode docs])(https:// sdkdocs .roku.com/display/sdkdoc/roSGNode))。在測試中,我可以驗證任何傳遞給全局的方法都是無效的。標記爲答案。 – neoRiley

相關問題