我不正确地使用了对象。基本上,我想要:
angular.module('mobileDashboardApp')
.directive('localForageModel', function ($localForage) {
return {
link: function postLink(scope, element, attrs) {
scope.$watch(attrs.ngModel, function () {
$localForage.setItem(attrs.localForageModel, scope[attrs.ngModel]);
console.log(attrs.ngModel);
console.log(scope[attrs.ngModel]);
console.log(scope.user.companyId);
console.log(scope["user.companyId"]);
});
}
};
});
输出
user.companyId
dsf
dsf
dsf
而不是当前输出:
user.companyId
undefined
dsf
undefined
有人能给我指正确的方向吗?或者建议一个更好的标题?
您的符号不正确,必须是
var props = attrs.ngModel.split(".");
scope[props[0]][props[1]]
由于点符号对动态属性无效,因此object['abc.def']
必须写成object['abc']['def']
需要注意的是,你肯定应该进行某种对象属性检查,例如,如果你的ngModel属性不是abc.def
,这将引发异常,所以最好为这个提供通用函数
在JS中,包含.
(点)的属性名和点访问的嵌套对象之间存在差异。所以scope.user.companyId
和scope["user.companyId"]
是不同的。你可以有这样的JS对象:
{
user: {
companyId: 1
},
"user.companyId" : 2
}
所以,如果您真的需要访问具有字符串的属性,该字符串表示对象内的路径(而不是单个属性名称),则需要对其进行解析。有很多方法可以做到这一点。天真的方式应该是这样的:
function getProperty(obj, pathString) {
var properties = pathString.split(".");
var result = obj;
for (var i in properties) {
result = result[properties[i]];
}
return result;
}
在您的情况下可以这样使用:getProperty(scope, "user.companyId")
。
访问对象的方式在例如。console.log(scope["user.companyId"]);
这应该是console.log(scope["user"]["companyId"]);
我希望这能帮助你:-)