2014-04-03 199 views
2

我在做什么: 我想动态更新基于ngModel的指令中的AngularJS范围。将数组转换为嵌套对象

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

ng-model="formdata.reports.first_name" 

如果我试图拉ngModel的指示,并指派东西吧,我结束了$范围[“formdata.reports.first_name”。它将它视为一个字符串而不是嵌套对象。

我现在这样: 我想通得到这个工作是将ngModel字符串分割成一个数组的唯一途径,所以我现在有工作:

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

该作品不错,我能现在静态长度使用动态值,如:

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

问题: 如何使日动态范围动态的长度?我希望这可以扩展到100个嵌套的对象,如果需要,甚至只是1.

更新: 我能够使用if语句来实现这个半动态,但我如何使用for循环,没有“最大”?

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"; 
    } 
} 
+0

$ scope.formdata.reports.first_name是否在你的指令中工作? – Pete

+0

是的,数据绑定也可以。 – JoshT

回答

2

这是一个答案

我注意到角是治疗我的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

+0

哇,这非常有帮助。我知道我正在推翻这个! – JoshT

0

动态寻路:

var obj = $scope; 

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

显然没有检查完成,所以如果路径错了,它会用一个错误失败。我发现你的原始问题与角度可疑,也许你可以在这个方向探索一下,然后再诉诸于此解决方法。

+0

我这样做,所以ng-model =“formdata.reports.first_name”可以更改为“first_name”或“formdata.reports.fe.fi.fo.fum.first_name”而不会破坏我的指令。我不知道,也许我正在推翻东西? – JoshT

相关问题