2017-08-21 5 views
0

Je vois dans le GJS GObject overrides il y a des définitions pour la plupart des types qui correspondent aux types Javascript, mais comment dois-je définir une propriété pour un tableau standard de chaînes? Certaines options qui me sont venues à l'esprit:Quelle est la manière correcte dans GJS de définir une propriété GObject pour un tableau?

  • utilise TYPE_OBJECT et un GList, mais GJS le mappera-t-il à un tableau lorsque je le récupèrerai?
  • utilisation TYPE_OBJECT et un GVariant avec un "comme" type et déballer moi-même
  • utilisation TYPE_BOXED et TYPE_ARRAY, mais est TYPE_ARRAY comparable au type Array Javascript?

Répondre

2

Ce n'est actuellement pas possible. Abonnez-vous à https://bugzilla.gnome.org/show_bug.cgi?id=727787 pour être averti quand il y a du progrès.

J'ai utilisé avec succès la deuxième option (GVariant avec le type as) dans le passé. L'option GList ne fonctionnera pas, car GJS ne fait pas attention au type de valeurs stockées dans le GList. La troisième option dont je ne suis pas sûr.

Voici un exemple minimal montrant comment utiliser l'option GVariant:

const GObject = imports.gi.GObject; 
const GLib = imports.gi.GLib; 

const MyClass = GObject.registerClass({ 
    Properties: { 
     'prop': GObject.param_spec_variant('prop', 'Prop', 'Prop', 
      new GLib.VariantType('as'), null, 
      GObject.ParamFlags.READABLE), 
    }, 
}, class MyClass extends GObject.Object { 
    get prop() { 
     return new GLib.Variant('as', ['one', 'two']); 
    } 
}); 

print(new MyClass().prop.deep_unpack()); 

(Si vous n'êtes pas en utilisant la nouvelle syntaxe de classe, il fonctionne toujours de la même manière avec l'ancien Lang.Class.)

+0

En guise de suivi, étant donné que je suppose que vous avez stocké le Variant sous la forme TYPE_OBJECT, puis-je supposer qu'il n'est pas possible d'avoir un Variant 'as' pour exporter en tant que propriété DBus' as'? Il ne semble pas y avoir de ParamSpec pour les variantes disponibles dans 'GObject.js' et même l'utilisation de la fonction stock semble étouffer. –

+1

Je vais modifier la réponse pour montrer comment le faire. – ptomato

+0

Intéressant, j'ai suivi votre exemple mais j'ai continué à recevoir une erreur appelant la propriété sur DBus 'Type attendu utf8 pour Argument 'strv' mais j'ai obtenu le type 'object'' jusqu'à ce que je revienne juste' [' one ',' deux '] ' getter. C'est correct, maintenant cela fonctionne aussi bien en interne sans déballer une variante partout, merci. –