diff --git a/addons/web/doc/module.rst b/addons/web/doc/module.rst index 02e0f9c250a..2e38733a25d 100644 --- a/addons/web/doc/module.rst +++ b/addons/web/doc/module.rst @@ -282,6 +282,27 @@ tools while playing with the stopwatch will show that the save (creation) request is indeed sent (and replied to, even though we're ignoring the response at this point). +These saved data should now be loaded and displayed when first opening +the action, so the user can see his previously recorded times. This is +done by overloading the model's ``start`` method: the purpose of +:js:func:`~openerp.base.Widget.start()` is to perform *asynchronous* +initialization steps, so the rest of the web client knows to "wait" +and gets a readiness signal. In this case, it will fetch the data +recorded previously using the :js:class:`~openerp.web.Query` interface +and add this data to an ordered list added to the widget's template: + +.. patch:: + +And for consistency's sake (so that the display a user leaves is +pretty much the same as the one he comes back to), newly created +records should also automatically be added to the list: + +.. patch:: + +Note that we're only displaying the record once we know it's been +saved from the database (the ``create`` call has returned without +error). + .. [#DOM-building] they are not alternative solutions: they work very well together. Templates are used to build "just DOM", sub-widgets are used to build DOM subsections diff --git a/addons/web/doc/module/20 b/addons/web/doc/module/20 new file mode 100644 index 00000000000..042ff28067c --- /dev/null +++ b/addons/web/doc/module/20 @@ -0,0 +1,64 @@ +Index: web_example/static/src/js/first_module.js +=================================================================== +--- web_example.orig/static/src/js/first_module.js ++++ web_example/static/src/js/first_module.js +@@ -11,20 +11,36 @@ openerp.web_example = function (instance + this._super.apply(this, arguments); + this._start = null; + this._watch = null; ++ this.model = new instance.web.Model('web_example.stopwatch'); ++ }, ++ start: function () { ++ var display = this.display_record.bind(this); ++ return this.model.query() ++ .filter([['user_id', '=', instance.session.uid]]) ++ .all().done(function (records) { ++ _(records).each(display); ++ }); + }, + current: function () { + // Subtracting javascript dates returns the difference in milliseconds + return new Date() - this._start; + }, +- update_counter: function (time) { ++ display_record: function (record) { ++ $('
+ +
++