Just to let you know that I finally got my datapipe class working as expected - thanks a lot for everyone's help. The trick was to reassign the datapointer's xpath attribute at the end of the ondata method. (4th line from the end). This forces it to update the second time data is received, and not just the first time.

<class name = "datapipe" extends = "node">
    <attribute name = "table" type = "string" />
    <dataset name="list" type="http" request = "false" /> 
    <dataset name="action" type="http" request = "false" />

    <method reference = "action" event="ondata">
        dp.setXPath("local:action:/");
    </method>
    
    <datapointer name = "dp">
    <method event="ondata">
    if (this.xpathQuery("result/text()") == "success") {
        parent.list.doRequest();
        Debug.write("Operation succeeded");
    } else {
        Debug.write("Operation failed");
    }
     this.setXPath("local:list:/");
     </method>
</datapointer>
</class>

The result is a canvas where all dynamic data automatically updates to stay in sync with the table records whenever the database is updated. 

Thanks again for your help.


On 1 May 2006, at 18:27, Henry Minsky wrote:

I believe an empty local datset will be created by the <dataset> declaration. That is, it will have no child elements. There may be some issue with how you are generating the ondata events. When I did this manually from the debugger, the xpath query worked fine.

  <class name = "datapipe" extends = "node">
      <attribute name = "table" type = "string" />
      <dataset name="action" type="http" request = "false" />
      <datapointer name='bar' xpath="local:action:/">
        <method event="ondata">
          var q = "results/text()";
          Debug.write(q, this.xpathQuery(q));
        </method>
      </datapointer>
   </class>

<datapipe id='foo'/>


In the debugger, I did this manually

lzx> k = new LzDataElement("results")
«LzDataElement#3| <results/>»
lzx> c = new LzDataText("success!")
«LzDataText(0)#4| []»
lzx> k.appendChild(c)
«LzDataText(0)#4| []»
lzx> foo.action.appendChild(k)
«LzDataElement#3| <results>success!</results>»
lzx> foo.bar
«LzDatapointer#0| <action><results>success!</results></action>»
lzx> foo.bar.ondata.sendEvent()
results/text() success!
lzx>


You're right there - the 'action' dataset is intended as a
'placeholder' that I can
route requests through from the main canvas. The idea is that
requests are
fed through the action dataset and an updated set of records is
returned via
the 'list' dataset on successful submission. This in turn
automatically updates
any views bound to the list dataset.

So there's no actual location for the action dataset until a request
is made from
the canvas - this was my intention, but I appreciate it's not the
traditional method.

Any other thoughts would be warmly received.
http://rafb.net/paste/results/eh2soq66.html



>> I'm having trouble referencing a dataset from within a class.
>>
>> The code here: http://rafb.net/paste/results/eh2soq66.html produces
>> the error "couldn't find dataset for action:/" (Line 13 is where it's
>> referenced.)
>>
>> Would anyone be kind enough to suggest what I should do to correct
>> it?


_______________________________________________
Laszlo-user mailing list
[email protected]
http://www.openlaszlo.org/mailman/listinfo/laszlo-user

Reply via email to