将数组转换为嵌套对象

时间:2014-04-03 14:47:19

标签: javascript angularjs

我想做的事情: 我试图在一个指令中使用AngularJS动态更新范围,基于ngModel。

一个小故事: 我注意到Angular将我的ngModel字符串视为字符串而不是对象。如果我有这个:

ng-model="formdata.reports.first_name"

如果我尝试在指令中提取ngModel并为其指定内容,我最终会使用$ scope [" formdata.reports.first_name"]。它将其视为字符串而不是嵌套对象。

我现在在做什么: 我认为让这个工作的唯一方法是将ngModel字符串拆分成一个数组,所以我现在正在使用:

models = ["formdata", "reports", "first_name"];

这非常好用,我现在可以在静态长度上使用动态值,如下所示:

$scope[models[0]][models[1]][models[2]] = "Bob";

问题: 如何使动态范围的长度动态化?我希望这可以在需要时为100个嵌套对象进行扩展,甚至只需1个。

更新: 我能够使用if语句创建这个半动态,但是我如何使用for循环,所以我没有#34; max"?

if (models[0]) {
    if (models[1]) {
        if (models[2]) {
            if (models[3]) {
                $scope[models[0]][models[1]][models[2]][models[3]] = "Bob";
            } else {
                $scope[models[0]][models[1]][models[2]] = "Bob";
            }
        } else {
            $scope[models[0]][models[1]] = "Bob";
        }
    } else {
        $scope[models[0]] = "Bob";
    }
}

2 个答案:

答案 0 :(得分:2)

这是

的答案
  

我注意到Angular将我的ngModel字符串视为字符串而不是对象

require属性添加到您的指令,然后将第四个ctrl参数添加到link函数

app.directive('myDirective', function() {
  return {
    require: 'ngModel',
    link: function(scope, element, attributes, ctrl) {
      // Now you have access to ngModelController for whatever you passed in with the ng-model="" attribute
      ctrl.$setViewValue('x');
    }
  };
});

示范:http://plnkr.co/edit/Fcl4cUXpdE5w6fHMGUgC

答案 1 :(得分:0)

动态路径:

var obj = $scope;

for (var i = 0; i<models.length-1; i++) {
  obj = obj[models[i]];
}
obj[models[models.length-1]] = 'Bob';

显然没有进行任何检查,因此如果路径错误,则会因错误而失败。我发现你的原始问题有角度可疑,也许你可以在采用这种解决方法之前探索一下这个方向。