我想做的事情: 我试图在一个指令中使用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";
}
}
答案 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');
}
};
});
答案 1 :(得分:0)
动态路径:
var obj = $scope;
for (var i = 0; i<models.length-1; i++) {
obj = obj[models[i]];
}
obj[models[models.length-1]] = 'Bob';
显然没有进行任何检查,因此如果路径错误,则会因错误而失败。我发现你的原始问题有角度可疑,也许你可以在采用这种解决方法之前探索一下这个方向。