Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# pb de datasource

Envoyé par : lucas

Date : 20/09/2005 16:22

Bonjour à tous.

Je suis tombé récemment sur un problème épineux qui me fait m'arracher les cheveux. Je cherche à remplir un <tree> avec un fichier rdf, de manière dynamique. Pour cela, j'utilise le module RDF de la JSLib.

Voici (en condensé) le code qui me pose problème :

Le fichier XUL :

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>

<window
  id="fenetre_principale"
  title="test"
  height="600"
  width="700"
  onload="init();"
   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

<script src="chrome://test/content/jslib/jslib.js"/>
<script src="chrome://test/content/jslib/rdf/rdfFile.js"/>

<script src="testrdf.js"/>

<hbox>
  <button label="test1" oncommand="test1();"/>
  <button label="test2" oncommand="test2();"/>
</hbox>

<tree id="ArbreFichiers" flex="1" selstyle="primary"  hidecolumnpicker="true">
  <treecols>
     <treecol id="name" primary="true" label="" flex="1"/>
  </treecols>

  <treechildren>

     <treeitem id="treeitem" label="truc" datasources="rdf:null" ref="urn:test">
        <template>
           <treechildren>
              <treeitem uri="rdf:*" label="rdf:http://www.truc.com/rdf#name"/>
           </treechildren>
        </template>
     </treeitem>

  </treechildren>

</tree>

</window>

On a un arbre connecté à une ressource vide (rdf:null) pour le moment, et deux boutons, qui vont créer du rdf en dynamique.

Le fichier JS :

var sRDF;
var datasource;

function init()
{
  sRDF = new RDFFile("/tmp/attr.rdf", null, "http://www.truc.com/rdf#", "TEST");
  sRDF.addRootSeq("urn:test");

  var tree = document.getElementById("treeitem");
  tree.database.AddDataSource(sRDF.dsource);
  tree.builder.rebuild();
}

function test1()
{
  var parentSeq = sRDF.getRootSeq("urn:test");
  var newSeq = parentSeq.addSeq("truc1");

  newSeq.setAttribute("TEST:name", "name1");

  sRDF.flush(); 
  sRDF.dsource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Refresh(true);
}

function test2()
{
  var parentSeq = sRDF.getRootSeq("urn:test:truc1");
  try {
  var newSeq = parentSeq.addSeq("truc2");
  } catch(e) {alert(e);}

  newSeq.setAttribute("TEST:name", "name2");

  sRDF.flush();
  sRDF.dsource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Refresh(true);
}

La fonction init() initialise le fichier RDF via la JSLib. Il rajoute le noeud principal. Il connecte ensuite l'arbre avec la datasource.

La fonction test1() crée une nouvelle séquence à partir du noeud principal.

La fonction test2() crée une nouvelle séquence, en partant du noeud créé par test1().

En lançant l'application, et en cliquant sur test1, on voit bien le nouveau noeud apparaitre (grâce au refresh). En cliquant sur test2... Erreur. Une exception de type NS_ERROR_UNEXPECTED dans rdfContainer.js, au niveau d'une méthode appendElement() d'un composant d'interface nsIRDFContainer.

Je ne comprend pas cette erreur, étant donné que test2 ne fait que répliquer test1. De plus, chose carrément étrange, il se trouve que si on rajoute deux (!) autres fois

sRDF.dsource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Refresh(true);

dans test1() et test2(), alors l'appli marche. Etonnant, non ?

Si vous avez une idée de l'origine du problème...

Merci.

Il n'est plus possible de poster des messages dans ce forum.


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.