Daniel@0: "use strict"; Daniel@0: Daniel@0: App.module("DataModule", function(DataModule, App, Backbone, Marionette, $, _, Logger) { Daniel@0: Daniel@0: DataModule.addInitializer(function(){ Daniel@0: //var logger = Logger.get("DataModule.DynamicDefinition"); Daniel@0: Daniel@0: DataModule.DynamicDefinition = DataModule.ModelWithHashableAttributes.extend({ Daniel@0: Daniel@0: initialize: function(attributes, options) { Daniel@0: DataModule.ModelWithHashableAttributes.prototype.initialize.apply(this, arguments); Daniel@0: Daniel@0: this._entityConfig = options.entityConfig; Daniel@0: this._provider = options.provider; Daniel@0: this._cachedRequestHash = "{}"; Daniel@0: Daniel@0: this.listenTo(this._entityConfig, "change:parameters", this.update); Daniel@0: this.update(); Daniel@0: }, Daniel@0: Daniel@0: update: function(force) { Daniel@0: var parameterHash = this._entityConfig.getHashForParameters(); Daniel@0: var requestHash = this._provider._requestHashesByParameterHash[parameterHash]; Daniel@0: if (!requestHash) { Daniel@0: var requestParameters = this._provider.configParametersToRequestParameters(this._entityConfig); Daniel@0: requestHash = JSON.stringify(requestParameters); Daniel@0: this._provider._requestHashesByParameterHash[parameterHash] = requestHash; Daniel@0: this._provider._requestParametersByRequestHash[requestHash] = requestParameters; Daniel@0: } Daniel@0: Daniel@0: if (requestHash == this._cachedRequestHash && !force) { Daniel@0: return; Daniel@0: } Daniel@0: Daniel@0: if (requestHash !== this._cachedRequestHash) { Daniel@0: if (this._cachedRequestHash) { Daniel@0: this.stopListening(this._provider, "change:" + this._cachedRequestHash, this._applyCachedAttributes); Daniel@0: } Daniel@0: this._cachedRequestHash = requestHash; Daniel@0: this.listenTo (this._provider, "change:" + this._cachedRequestHash, this._applyCachedAttributes); Daniel@0: } Daniel@0: Daniel@0: if (this._provider._cachedAttributesByRequestHash[this._cachedRequestHash] && !force) { Daniel@0: this._applyCachedAttributes(); Daniel@0: } else { Daniel@0: this._provider.updateResponseForRequestHash(requestHash); Daniel@0: }; Daniel@0: }, Daniel@0: Daniel@0: _applyCachedAttributes: function() { Daniel@0: var definitionAttributes = this._provider._cachedAttributesByRequestHash[this._cachedRequestHash]; Daniel@0: if (_.isUndefined(definitionAttributes)) { Daniel@0: throw _.str.sprintf("Unexpected cached attributes for DynamicDefinition to be undefined"); Daniel@0: } Daniel@0: Daniel@0: if (!_.isEqual(this.attributes, definitionAttributes)) { Daniel@0: this.attributes = definitionAttributes; Daniel@0: this.trigger("change"); Daniel@0: } Daniel@0: } Daniel@0: }); Daniel@0: }); Daniel@0: Daniel@0: }, Logger);