if (!dojo._hasResource["dojox.wire.ml.Invocation"]) { // _hasResource checks // added by build. Do // not use _hasResource // directly in your // code. dojo._hasResource["dojox.wire.ml.Invocation"] = true; dojo.provide("dojox.wire.ml.Invocation"); dojo.require("dojox.wire.ml.Action"); dojo.declare("dojox.wire.ml.Invocation", dojox.wire.ml.Action, { // summary: // A widget to invoke a method or publish a topic // description: // This widget represents a controller task to invoke a method or // publish a topic when an event (a function) or a topic is issued. // object: // A scope of a method to invoke // method: // A name of a method to invoke // topic: // A name of a topic to publish // parameters: // Arguments for the method or the topic // result: // A property to store a return value of the method call // error: // A property to store an error on the method call object : "", method : "", topic : "", parameters : "", result : "", error : "", _run : function() { // summary: // Invoke a method or publish a topic // description: // If 'topic' is specified, the topic is published with arguments // specified to 'parameters'. // If 'method' and 'object' are specified, the method is invoked // with arguments specified to 'parameters' and set the return // value to a property specified to 'result'. // 'object', 'parameters' and 'result' can specify properties of // a widget or an DOM element with the dotted notation. // If 'parameters' are omitted, the arguments to this method are // passed as is. if (this.topic) { var args = this._getParameters(arguments); try { dojo.publish(this.topic, args); this.onComplete(); } catch (e) { this.onError(e); } } else if (this.method) { var scope = (this.object ? dojox.wire.ml._getValue(this.object) : dojo.global); if (!scope) { return; // undefined } var args = this._getParameters(arguments); var func = scope[this.method]; if (!func) { func = scope.callMethod; if (!func) { return; // undefined } args = [this.method, args]; } try { var connected = false; if (scope.getFeatures) { var features = scope.getFeatures(); if ((this.method == "fetch" && features["dojo.data.api.Read"]) || (this.method == "save" && features["dojo.data.api.Write"])) { var arg = args[0]; if (!arg.onComplete) { arg.onComplete = function() { }; } // dojo.connect(arg, "onComplete", this, // "onComplete"); this.connect(arg, "onComplete", "onComplete"); if (!arg.onError) { arg.onError = function() { }; } // dojo.connect(arg, "onError", this, "onError"); this.connect(arg, "onError", "onError"); connected = true; } } var r = func.apply(scope, args); if (!connected) { if (r && (r instanceof dojo.Deferred)) { var self = this; r.addCallbacks(function(result) { self.onComplete(result); }, function(error) { self.onError(error); }); } else { this.onComplete(r); } } } catch (e) { this.onError(e); } } }, onComplete : function(/* anything */result) { // summary: // A function called when the method or the topic publish // completed // description: // If 'result' attribute is specified, the result object also set // to the specified property. // result: // The return value of a method or undefined for a topic if (this.result) { dojox.wire.ml._setValue(this.result, result); } if (this.error) { // clear error dojox.wire.ml._setValue(this.error, ""); } }, onError : function(/* anything */error) { // summary: // A function called on an error occurs // description: // If 'error' attribute is specified, the error object also set to // the specified property. // error: // The exception or error occurred if (this.error) { if (error && error.message) { error = error.message; } dojox.wire.ml._setValue(this.error, error); } }, _getParameters : function(/* Array */args) { // summary: // Returns arguments to a method or topic to invoke // description: // This method retunrs an array of arguments specified by // 'parameters' attribute, a comma-separated list of IDs and // their properties in a dotted notation. // If 'parameters' are omitted, the original arguments are // used. // args: // Arguments to a trigger event or topic if (!this.parameters) { // use arguments as is return args; // Array } var parameters = []; var list = this.parameters.split(","); if (list.length == 1) { var parameter = dojox.wire.ml._getValue(list[0], args); if (dojo.isArray(parameter)) { parameters = parameter; } else { parameters.push(parameter); } } else { for (var i in list) { parameters.push(dojox.wire.ml._getValue(list[i], args)); } } return parameters; // Array } }); }