diff --git a/view/view.js b/view/view.js index 50d152dd42e..3dcfa9e5e04 100644 --- a/view/view.js +++ b/view/view.js @@ -56,7 +56,13 @@ steal('can/util', function (can) { * @param {Boolean} async If the ajax request should be asynchronous. * @returns {can.Deferred} a `view` renderer deferred. */ - var get = function (obj, async) { + var getRenderer = function (obj, async) { + // If `obj` already is a renderer function just resolve a Deferred with it + if(isFunction(obj)) { + var def = can.Deferred(); + return def.resolve(obj); + } + var url = typeof obj === 'string' ? obj : obj.url, suffix = (obj.engine && '.' + obj.engine) || url.match(/\.[\w\d]+$/), type, @@ -191,15 +197,9 @@ steal('can/util', function (can) { callback = helpers; helpers = undefined; } - var result; - // Get the result, if a renderer function is passed in, then we just use that to render the data - if( isFunction(view) ) { - result = view(data, helpers, callback); - } else { - result = $view.renderAs("fragment",view, data, helpers, callback); - } - return result; + // Render the view as a fragment + return $view.renderAs("fragment",view, data, helpers, callback); }; // can.view methods @@ -608,7 +608,7 @@ steal('can/util', function (can) { dataCopy = can.extend({}, data); // Add the view request to the list of deferreds. - deferreds.push(get(view, true)); + deferreds.push(getRenderer(view, true)); // Wait for the view and all deferreds to finish... can.when.apply(can, deferreds) .then(function (resolved) { @@ -655,7 +655,7 @@ steal('can/util', function (can) { // If there's a `callback` function async = isFunction(callback); // Get the `view` type - deferred = get(view, async); + deferred = getRenderer(view, async); if (reading) { can.__setReading(reading); diff --git a/view/view_test.js b/view/view_test.js index 26ccc8eea85..06f4b805a24 100644 --- a/view/view_test.js +++ b/view/view_test.js @@ -815,4 +815,22 @@ steal("can/view/callbacks", } ok(pass); }); + test('renderer passed with Deferred gets executed (#1139)', 1, function() { + // See http://jsfiddle.net/a35ZH/1/ + var template = can.view.mustache('

Value is {{value}}!

'); + var def = can.Deferred(); + + stop(); + + setTimeout(function() { + def.resolve({ + value: 'Test' + }); + }, 50); + + can.view(template, def, function (frag) { + equal(frag.textContent, 'Value is Test!'); + start(); + }); + }); });