diff --git a/addons/web/static/src/js/views/basic/basic_renderer.js b/addons/web/static/src/js/views/basic/basic_renderer.js index a18a82e5745..dd0f59a4176 100644 --- a/addons/web/static/src/js/views/basic/basic_renderer.js +++ b/addons/web/static/src/js/views/basic/basic_renderer.js @@ -176,23 +176,17 @@ var BasicRenderer = AbstractRenderer.extend({ * @param {Object} modifiersData * @param {Object} record * @param {Object} [element] - do the update only on this element if given - * @returns {Deferred} resolved once finished */ _applyModifiers: function (modifiersData, record, element) { var self = this; - var defs = []; var modifiers = modifiersData.evaluatedModifiers[record.id] || {}; - this.defs = defs; // Potentially filled by widget rerendering if (element) { _apply(element); } else { // Clone is necessary as the list might change during _.each _.each(_.clone(modifiersData.elementsByRecord[record.id]), _apply); } - delete this.defs; - - return $.when.apply($, defs); function _apply(element) { // If the view is in edit mode and that a widget have to switch @@ -540,10 +534,13 @@ var BasicRenderer = AbstractRenderer.extend({ _updateAllModifiers: function (record) { var self = this; - var defs = _.flatten(_.map(this.allModifiersData, function (modifiersData) { + var defs = []; + this.defs = defs; // Potentially filled by widget rerendering + _.each(this.allModifiersData, function (modifiersData) { self._computeModifiers(modifiersData, record); - return self._applyModifiers(modifiersData, record); - })); + self._applyModifiers(modifiersData, record); + }); + delete this.defs; return $.when.apply($, defs); }, diff --git a/addons/web/static/tests/views/form_tests.js b/addons/web/static/tests/views/form_tests.js index ce2f3b37f29..804ac737ef7 100644 --- a/addons/web/static/tests/views/form_tests.js +++ b/addons/web/static/tests/views/form_tests.js @@ -3112,5 +3112,27 @@ QUnit.module('Views', { "the stat button should contain a span with the string attribute value"); form.destroy(); }); + + QUnit.test('renderer waits for asynchronous fields rendering', function (assert) { + assert.expect(1); + var done = assert.async(); + + testUtils.createAsyncView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
', + res_id: 1, + }).then(function (form) { + assert.strictEqual(form.$('.ace_editor').length, 1, + "should have waited for ace to load its dependencies"); + form.destroy(); + done(); + }); + }); }); });