Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit ee579a0

Browse files
committed
feat(jqLite): support data() getter and data(obj) setter
... just like jquery does
1 parent 5df7e6f commit ee579a0

File tree

2 files changed

+72
-14
lines changed

2 files changed

+72
-14
lines changed

src/jqLite.js

+15-1
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,21 @@ function JQLiteData(element, key, value) {
215215
}
216216
cache[key] = value;
217217
} else {
218-
return cache ? cache[key] : null;
218+
if (isDefined(key)) {
219+
if (isObject(key)) {
220+
if (!cacheId) element[jqName] = cacheId = jqNextId();
221+
jqCache[cacheId] = cache = (jqCache[cacheId] || {});
222+
extend(cache, key);
223+
} else {
224+
return cache ? cache[key] : undefined;
225+
}
226+
} else {
227+
if (!cacheId) element[jqName] = cacheId = jqNextId();
228+
229+
return cache
230+
? cache
231+
: cache = jqCache[cacheId] = {};
232+
}
219233
}
220234
}
221235

test/jqLiteSpec.js

+57-13
Original file line numberDiff line numberDiff line change
@@ -222,22 +222,23 @@ describe('jqLite', function() {
222222
it('should set and get and remove data', function() {
223223
var selected = jqLite([a, b, c]);
224224

225-
expect(selected.data('prop', 'value')).toEqual(selected);
226-
expect(selected.data('prop')).toEqual('value');
227-
expect(jqLite(a).data('prop')).toEqual('value');
228-
expect(jqLite(b).data('prop')).toEqual('value');
229-
expect(jqLite(c).data('prop')).toEqual('value');
225+
expect(selected.data('prop')).toBeUndefined();
226+
expect(selected.data('prop', 'value')).toBe(selected);
227+
expect(selected.data('prop')).toBe('value');
228+
expect(jqLite(a).data('prop')).toBe('value');
229+
expect(jqLite(b).data('prop')).toBe('value');
230+
expect(jqLite(c).data('prop')).toBe('value');
230231

231232
jqLite(a).data('prop', 'new value');
232-
expect(jqLite(a).data('prop')).toEqual('new value');
233-
expect(selected.data('prop')).toEqual('new value');
234-
expect(jqLite(b).data('prop')).toEqual('value');
235-
expect(jqLite(c).data('prop')).toEqual('value');
233+
expect(jqLite(a).data('prop')).toBe('new value');
234+
expect(selected.data('prop')).toBe('new value');
235+
expect(jqLite(b).data('prop')).toBe('value');
236+
expect(jqLite(c).data('prop')).toBe('value');
236237

237-
expect(selected.removeData('prop')).toEqual(selected);
238-
expect(jqLite(a).data('prop')).toEqual(undefined);
239-
expect(jqLite(b).data('prop')).toEqual(undefined);
240-
expect(jqLite(c).data('prop')).toEqual(undefined);
238+
expect(selected.removeData('prop')).toBe(selected);
239+
expect(jqLite(a).data('prop')).toBeUndefined();
240+
expect(jqLite(b).data('prop')).toBeUndefined();
241+
expect(jqLite(c).data('prop')).toBeUndefined();
241242
});
242243

243244
it('should call $destroy function if element removed', function() {
@@ -247,6 +248,49 @@ describe('jqLite', function() {
247248
element.remove();
248249
expect(log).toEqual('destroy;');
249250
});
251+
252+
it('should retrieve all data if called without params', function() {
253+
var element = jqLite(a);
254+
expect(element.data()).toEqual({});
255+
256+
element.data('foo', 'bar');
257+
expect(element.data()).toEqual({foo: 'bar'});
258+
259+
element.data().baz = 'xxx';
260+
expect(element.data()).toEqual({foo: 'bar', baz: 'xxx'});
261+
});
262+
263+
it('should create a new data object if called without args', function() {
264+
var element = jqLite(a),
265+
data = element.data();
266+
267+
expect(data).toEqual({});
268+
element.data('foo', 'bar');
269+
expect(data).toEqual({foo: 'bar'});
270+
});
271+
272+
it('should create a new data object if called with a single object arg', function() {
273+
var element = jqLite(a),
274+
newData = {foo: 'bar'};
275+
276+
element.data(newData);
277+
expect(element.data()).toEqual({foo: 'bar'});
278+
expect(element.data()).not.toBe(newData); // create a copy
279+
});
280+
281+
it('should merge existing data object with a new one if called with a single object arg',
282+
function() {
283+
var element = jqLite(a);
284+
element.data('existing', 'val');
285+
expect(element.data()).toEqual({existing: 'val'});
286+
287+
var oldData = element.data(),
288+
newData = {meLike: 'turtles', 'youLike': 'carrots'};
289+
290+
expect(element.data(newData)).toBe(element);
291+
expect(element.data()).toEqual({meLike: 'turtles', youLike: 'carrots', existing: 'val'});
292+
expect(element.data()).toBe(oldData); // merge into the old object
293+
});
250294
});
251295

252296

0 commit comments

Comments
 (0)