2016-12-20 4 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 

Когда она попадает линия 16 из MainController, я получаю это:

Функция-член не найдена в компоненте BrightScript или интерфейсе. (ошибка времени выполнения & HF4) в упак: /components/MainController.brs (16)

Это просто общий тест, что может/не может быть сделано так, пожалуйста, не комментируйте ли это является «хорошей практикой» или нет. Я просто хочу знать, если это возможно, и если да, то что мне здесь не хватает? Спасибо за любую помощь

ответ

4

Вы, , могут быть, имеют roAssociativeArray значения. На самом деле это то, как методы OO выполняются в BrightScript.

Однако вы не можете назначить функции полям объекта сцены Roku Scene (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

Большое спасибо - документы говорят, что это возвращаемый объект roSGNode, как описано в [getGlobalNode() docs] (https://sdkdocs.roku.com/display/sdkdoc/ifRoSGScreen#ifRoSGScreen-getGlobalNode() asroSGNode) - Я думаю, что путаница возникает там, где документы говорят, что вы можете назначать анонимные функции как значения в roAssociativeArray, а затем в документах для roSGNode, он говорит, что он реализует/поддерживает ifAssociativeArray ([roSGNode docs] (https: // sdkdocs .roku.com/display/sdkdoc/roSGNode)). При тестировании я могу проверить, что любой метод, переданный глобальному, определенно недействителен. Маркировка как ответ. – neoRiley

Смежные вопросы