AngularJS指令未正确评估对象

时间:2016-01-07 18:45:21

标签: javascript

我以某种方式不正确地使用对象。基本上,我想:

dbGetQuery

输出

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

有人能指出我正确的方向吗?或建议更好的标题?

3 个答案:

答案 0 :(得分:1)

你的表示法不正确,必须是

var props = attrs.ngModel.split(".");
scope[props[0]][props[1]]

由于点符号对动态属性无效,因此object['abc.def']必须写为object['abc']['def']

旁注,肯定你应该进行某种对象属性检查,例如,如果你的ngModel属性不是abc.def - 这将抛出异常,所以最好有这个通用函数

答案 1 :(得分:0)

在JS中,包含.(点)的属性名称与由dot访问的嵌套对象之间存在差异。因此scope.user.companyIdscope["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")

答案 2 :(得分:0)

您访问该对象的方式不正确,例如 console.log(scope["user.companyId"]);

这应该是 console.log(scope["user"]["companyId"]);

我希望这可以帮助你: - )