感觉有点愚蠢的问... 我想得到这样的东西:
var value = $scope.settings.paper.font.color || 0;
问题是某些中间对象可能不存在。
如果所有“对象链”都存在,是否存在获得值的最终方法,如果不存在则获得一些回退?
例如,如果所有对象都存在,我们可以返回颜色的值,但是如果只存在$ scope.settings,并且没有 paper 对象它,我会得到一个错误,而不是0。
答案 0 :(得分:2)
首先:它没有内置功能。
只需将其打包成try
- catch
try {
// handles defaultVal if d is undefined
yourVar = typeof a.b.c.d === 'undefined' ? defaultVal:a.b.c.d;
} catch (e) {
// handles defaultVal if a,b or c are undefined
yourVar = defaultVal;
}
您可以使用以下函数安全地遍历对象(gv
- for getValue
):
var gv = function(scope, chainStr, defaultValue) {
var chain = chainStr.split('.');
for (var i = 0; i < chain.length; i++) {
var newScope = scope[chain[i]];
if (typeof newScope !== 'undefined') {
scope = newScope;
} else {
return defaultValue;
}
};
return newScope;
};
像这样:
var a = {b:{c:{d:3}}};
console.log(gv(window, 'a.b.c.d', -1));
// 3
console.log(gv(window, 'a.b.c.e', -1));
// -1
console.log(gv(a, 'b.c.d', -1));
// 3
console.log(gv(a, 'b.c.e', -1));
// -1
答案 1 :(得分:1)
当然,只需检查$ scope和命名空间中每个属性的存在:
var value = (typeof $scope != 'undefined' && $scope.settings && $scope.settings.paper && $scope.settings.paper.font && $scope.settings.paper.font.color) || 0;
括号中语句的最后一部分将返回.font
的值答案 2 :(得分:0)
您还可以使用$parse
服务中的内置版本:
var value = $parse('settings.paper.font.color || 0')($scope);
它将在幕后进行所有必要的检查。