2016-12-20 1 views
3

Nouveau dans le développement de roku/brightscript: Est-il possible d'ajouter un objet au tableau associatif global (accessible par tous les composants), dont une méthode est définie comme l'une des propriétés, et d'appeler cette méthode?Est-il possible d'affecter une fonction anonyme à une propriété globale de tableau associatif?

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 

.. puis dans une autre MainController, après l'exécution d'une tâche et les données de retour ...

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 

Quand il frappe la ligne 16 de MainController, je reçois ceci:

Fonction membre introuvable dans BrightScript Component ou l'interface. (erreur d'exécution & HF4) dans pkg: /components/MainController.brs (16)

Ceci est juste un test général de ce qui peut/ne peut pas être fait s'il vous plaît ne pas commenter si ce est "bonne pratique" ou non. Je veux juste savoir si c'est possible et si oui, qu'est-ce qui me manque ici? Merci pour toute aide

Répondre

4

Vous pouvez avoir des fonctions comme valeurs roAssociativeArray. En fait, c'est ainsi que les méthodes OO sont effectuées dans BrightScript.

Cependant, vous ne pouvez pas affecter des fonctions aux champs d'un objet graphique Roku Scene (roSgNode)! Directement ou indirectement (imbriqué). C'est une limitation de l'implémentation (actuelle?!).

Vous pouvez voir la liste des types de terrain pris en charge par RSG ici https://sdkdocs.roku.com/pages/viewpage.action?pageId=1608549

Oui, il ne dit pour soutenir assocarray et (en ces derniers temps) array - mais il y a une mise en garde à cela! Lorsque vous attribuez (ou même accédez) à des objets composés entre des threads, une copie profonde est effectuée et seuls les types «pris en charge» passent à travers - et comme vous l'avez expérimenté, function n'en fait pas partie. Toutes les données non reconnues sont actuellement silencieusement supprimées, sans même un murmure d'avertissement - alors faites attention à l'acheteur.

Voir https://forums.roku.com/viewtopic.php?f=34&t=96955&p=541965#p541965 pour plus d'informations. Sentez-vous invité à ajouter votre voix dans le forum des développeurs de Roku, demandant le support du type de fonction par RSG - ils ont tendance à écouter si suffisamment de gens se plaignent.

+0

Marquer cela comme la réponse - merci pour l'explication en profondeur! Je vais me diriger vers les forums ... :) – neoRiley

1

Vous ne pouvez pas passer des fonctions dans les champs de nœud. Seules les données Si vous vérifiez la valeur m.global.mainMethods.getName juste après l'avoir définie, elle sera invalide.

+0

Merci beaucoup - les docs disent que c'est un objet roSGNode retourné comme décrit dans [docs getGlobalNode()] (https://sdkdocs.roku.com/display/sdkdoc/ifRoSGScreen#ifRoSGScreen-getGlobalNode() asroSGNode) - Je suppose que la confusion vient où les docs disent que vous pouvez assigner des fonctions anonymes comme valeurs dans un roAssociativeArray, puis dans les docs pour roSGNode, il dit qu'il implémente/supporte ifAssociativeArray ([docs roSGNode] (https: // sdkdocs .roku.com/display/sdkdoc/roSGNode)). Lors des tests, je peux vérifier que toute méthode passée à global est définitivement invalide. Marquage comme réponse. – neoRiley