diff --git a/can-view-model.js b/can-view-model.js index c648436..b633450 100644 --- a/can-view-model.js +++ b/can-view-model.js @@ -6,13 +6,18 @@ var ns = require("can-namespace"); var getDocument = require("can-util/dom/document/document"); var isArrayLike = require('can-util/js/is-array-like/is-array-like'); module.exports = ns.viewModel = function (el, attr, val) { + var scope ; if (typeof el === 'string') { el = getDocument().querySelector(el); } else if (isArrayLike(el)) { el= el[0]; } - var scope = domData.get.call(el, "viewModel"); + if (types.isMapLike(attr)) { + return domData.set.call( el, "viewModel", attr); + } + + scope = domData.get.call(el, "viewModel"); if(!scope) { scope = types.DefaultMap ? new types.DefaultMap() : new SimpleMap(); domData.set.call(el, "viewModel", scope); diff --git a/can-view-model_test.js b/can-view-model_test.js index 3d2a3e2..2ee4465 100644 --- a/can-view-model_test.js +++ b/can-view-model_test.js @@ -1,6 +1,8 @@ var QUnit = require('steal-qunit'); var viewModel = require('can-view-model'); var SimpleMap = require('can-simple-map'); +var CanMap = require('can-map'); +var DefineMap = require("can-define/map/map"); var types = require('can-types'); QUnit.module('can-view-model'); @@ -27,6 +29,36 @@ QUnit.test('a selector can be passed as the first argument (#6)', function(){ types.DefaultMap = DefaultMap; }); +QUnit.test('set custom can-simple-map on element (#5)', function(){ + var vm, elVm; + var CustomMap = SimpleMap.extend({}); + var el = document.createElement('div'); + document.getElementById('qunit-fixture').appendChild(el); + vm = new CustomMap({ foo: 'bar' }); + elVm = viewModel(el, vm); + QUnit.equal(viewModel(el,'foo'), 'bar'); +}); + +QUnit.test('set custom can-map on element (#5)', function(){ + var vm, elVm; + var CustomMap = CanMap.extend({}); + var el = document.createElement('div'); + document.getElementById('qunit-fixture').appendChild(el); + vm = new CustomMap({ foo: 'bar' }); + elVm = viewModel(el, vm); + QUnit.equal(viewModel(el,'foo'), 'bar'); +}); + +QUnit.test('set custom can-define-map on element (#5)', function(){ + var vm, elVm; + var CustomMap = DefineMap.extend({}); + var el = document.createElement('div'); + document.getElementById('qunit-fixture').appendChild(el); + vm = new CustomMap({ foo: 'bar' }); + elVm = viewModel(el, vm); + QUnit.equal(viewModel(el,'foo'), 'bar'); +}); + QUnit.test('Allow passing array like (jQuery) element', function(){ var DefaultMap = types.DefaultMap; var $el = {};