Skip to content
This repository was archived by the owner on Sep 20, 2019. It is now read-only.

Commit 7bd60a0

Browse files
committed
easier null checking to deal with bad null checks like 'defaults.controls.layers.visible'
1 parent 9349fb7 commit 7bd60a0

File tree

8 files changed

+67
-60
lines changed

8 files changed

+67
-60
lines changed

dist/ui-leaflet.js

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*!
2-
* ui-leaflet 1.0.1 2016-06-08
2+
* ui-leaflet 1.0.1 2016-09-17
33
* ui-leaflet - An AngularJS directive to easily interact with Leaflet maps
44
* git: https://github.com/angular-ui/ui-leaflet
55
*/
@@ -230,14 +230,15 @@ angular.module('ui-leaflet').factory('leafletBoundsHelpers', ["leafletLogger", "
230230
angular.module('ui-leaflet').factory('leafletControlHelpers', ["$rootScope", "leafletLogger", "leafletHelpers", "leafletLayerHelpers", "leafletMapDefaults", function ($rootScope, leafletLogger, leafletHelpers, leafletLayerHelpers, leafletMapDefaults) {
231231
var isDefined = leafletHelpers.isDefined,
232232
isObject = leafletHelpers.isObject,
233+
get = leafletHelpers.get,
233234
createLayer = leafletLayerHelpers.createLayer,
234235
_controls = {},
235236
errorHeader = leafletHelpers.errorHeader + ' [Controls] ',
236237
$log = leafletLogger;
237238

238239
var _controlLayersMustBeVisible = function(baselayers, overlays, mapId) {
239240
var defaults = leafletMapDefaults.getDefaults(mapId);
240-
if(!defaults.controls.layers.visible) {
241+
if(!get(defaults, 'controls.layers.visible')) {
241242
return false;
242243
}
243244

@@ -275,7 +276,7 @@ angular.module('ui-leaflet').factory('leafletControlHelpers', ["$rootScope", "le
275276
angular.extend(controlOptions, defaults.controls.layers.options);
276277

277278
var control;
278-
if(defaults.controls.layers && isDefined(defaults.controls.layers.control)) {
279+
if(!!get(defaults, 'controls.layers.control')) {
279280
control = defaults.controls.layers.control.apply(this, [[], [], controlOptions]);
280281
} else {
281282
control = new L.control.layers([], [], controlOptions);
@@ -619,21 +620,15 @@ angular.module('ui-leaflet').service('leafletHelpers', ["$q", "$log", function($
619620
};
620621
_getObjectValue(obj,"bike.1") returns 'hi'
621622
this is getPath in ui-gmap
623+
624+
like _.get
625+
http://stackoverflow.com/questions/2631001/javascript-test-for-existence-of-nested-object-key?page=1&tab=active#tab-top
622626
*/
623-
var _getObjectValue = function(object, pathStr) {
624-
var obj;
625-
if (!object || !angular.isObject(object))
626-
return;
627-
//if the key is not a sting then we already have the value
628-
if ((pathStr === null) || !angular.isString(pathStr)) {
629-
return pathStr;
630-
}
631-
obj = object;
632-
pathStr.split('.').forEach(function(value) {
633-
if (obj) {
634-
obj = obj[value];
635-
}
636-
});
627+
var _getObjectValue = function (object, path){
628+
if(!object) return;
629+
path = path.split('.');
630+
var obj = object[path.shift()];
631+
while(obj && path.length) obj = obj[path.shift()];
637632
return obj;
638633
};
639634

@@ -751,6 +746,7 @@ angular.module('ui-leaflet').service('leafletHelpers', ["$q", "$log", function($
751746
clone: _clone,
752747
errorHeader: _errorHeader,
753748
getObjectValue: _getObjectValue,
749+
get: _getObjectValue,
754750
getObjectArrayPath: _getObjectArrayPath,
755751
getObjectDotPath: _getObjectDotPath,
756752
defaultTo: function(val, _default) {

dist/ui-leaflet.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/ui-leaflet.min.no-header.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/ui-leaflet_dev_mapped.js

Lines changed: 13 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/ui-leaflet_dev_mapped.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/services/leafletControlHelpers.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
angular.module('ui-leaflet').factory('leafletControlHelpers', function ($rootScope, leafletLogger, leafletHelpers, leafletLayerHelpers, leafletMapDefaults) {
22
var isDefined = leafletHelpers.isDefined,
33
isObject = leafletHelpers.isObject,
4+
get = leafletHelpers.get,
45
createLayer = leafletLayerHelpers.createLayer,
56
_controls = {},
67
errorHeader = leafletHelpers.errorHeader + ' [Controls] ',
78
$log = leafletLogger;
89

910
var _controlLayersMustBeVisible = function(baselayers, overlays, mapId) {
1011
var defaults = leafletMapDefaults.getDefaults(mapId);
11-
if(!defaults.controls.layers.visible) {
12+
if(!get(defaults, 'controls.layers.visible')) {
1213
return false;
1314
}
1415

@@ -46,7 +47,7 @@ angular.module('ui-leaflet').factory('leafletControlHelpers', function ($rootSco
4647
angular.extend(controlOptions, defaults.controls.layers.options);
4748

4849
var control;
49-
if(defaults.controls.layers && isDefined(defaults.controls.layers.control)) {
50+
if(!!get(defaults, 'controls.layers.control')) {
5051
control = defaults.controls.layers.control.apply(this, [[], [], controlOptions]);
5152
} else {
5253
control = new L.control.layers([], [], controlOptions);

src/services/leafletHelpers.js

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,15 @@ angular.module('ui-leaflet').service('leafletHelpers', function($q, $log) {
1414
};
1515
_getObjectValue(obj,"bike.1") returns 'hi'
1616
this is getPath in ui-gmap
17+
18+
like _.get
19+
http://stackoverflow.com/questions/2631001/javascript-test-for-existence-of-nested-object-key?page=1&tab=active#tab-top
1720
*/
18-
var _getObjectValue = function(object, pathStr) {
19-
var obj;
20-
if (!object || !angular.isObject(object))
21-
return;
22-
//if the key is not a sting then we already have the value
23-
if ((pathStr === null) || !angular.isString(pathStr)) {
24-
return pathStr;
25-
}
26-
obj = object;
27-
pathStr.split('.').forEach(function(value) {
28-
if (obj) {
29-
obj = obj[value];
30-
}
31-
});
21+
var _getObjectValue = function (object, path){
22+
if(!object) return;
23+
path = path.split('.');
24+
var obj = object[path.shift()];
25+
while(obj && path.length) obj = obj[path.shift()];
3226
return obj;
3327
};
3428

@@ -146,6 +140,7 @@ angular.module('ui-leaflet').service('leafletHelpers', function($q, $log) {
146140
clone: _clone,
147141
errorHeader: _errorHeader,
148142
getObjectValue: _getObjectValue,
143+
get: _getObjectValue,
149144
getObjectArrayPath: _getObjectArrayPath,
150145
getObjectDotPath: _getObjectDotPath,
151146
defaultTo: function(val, _default) {

test/unit/services/leafletHelpersSpec.coffee

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,30 @@ describe 'leafletHelpers', ->
4242
expect(@subject.defaultTo(null, '')).toBe('')
4343

4444
describe 'Object Helpers', ->
45-
it 'should correctly fetch object values using dot-notation', ->
46-
object = { foo: { sea: 'hawks' }}
47-
expect(@subject.getObjectValue(object, 'foo.sea')).toEqual('hawks')
48-
expect(@subject.getObjectValue(object, 'foo.sea.birds')).toEqual(undefined)
49-
expect(@subject.getObjectValue(object, 'boo.hoo')).toEqual(undefined)
45+
describe 'get / getObjectValue', ->
46+
it 'should correctly fetch object values using dot-notation', ->
47+
object = { foo: { sea: 'hawks' }}
48+
expect(@subject.getObjectValue(object, 'foo.sea')).toEqual('hawks')
49+
expect(@subject.getObjectValue(object, 'foo.sea.birds')).toEqual(undefined)
50+
expect(@subject.getObjectValue(object, 'boo.hoo')).toEqual(undefined)
51+
52+
53+
describe 'undefined tests', ->
54+
it 'starts undefined is undefined', ->
55+
object = undefined
56+
expect(@subject.get(object, 'foo.sea')).toBeFalsy()
57+
58+
it 'second depth field undefined, with attempt to access third depth', ->
59+
object =
60+
second:
61+
third:
62+
fourth: true
63+
64+
expect(@subject.get(object, 'second.third.fourth')).toBeTruthy()
65+
66+
object.second.third = undefined
67+
expect(@subject.get(object, 'second.third.fourth'))
68+
5069

5170
describe 'obtainEffectiveMapId', ->
5271
describe 'no mapId', ->

0 commit comments

Comments
 (0)