在AngularJs中设置dynamic范围variables – <some_string>

我有一个string,我从一个routeParam或一个指令属性或任何获得,我想创build一个基于这个范围的variables。 所以:

 $scope.<the_string> = "something". 

但是,如果string包含一个或多个点,我想将其拆分,并实际“向下钻取”到范围中。 所以'foo.bar'应该变成$scope.foo.bar 。 这意味着简单的版本将无法正常工作!

 // This will not work as assigning variables like this will not "drill down" // It will assign to a variables named the exact string, dots and all. var the_string = 'life.meaning'; $scope[the_string] = 42; console.log($scope.life.meaning); // <-- Nope! This is undefined. console.log($scope['life.meaning']); // <-- It is in here instead! 

当读取一个基于string的variables时,可以通过$scope.$eval(the_string)来获得这个行为,但是如何在赋值的时候这么做呢?

我find的解决scheme是使用$ parse 。

“将angular度expression式转化为函数”

如果有人有一个更好的,请添加一个新的答案的问题!

这是一个例子:

 var the_string = 'life.meaning'; // Get the model var model = $parse(the_string); // Assigns a value to it model.assign($scope, 42); // Apply it to the scope // $scope.$apply(); <- According to comments, this is no longer needed console.log($scope.life.meaning); // logs 42 

以Erik的答案为出发点。 我find了一个更简单的解决scheme,为我工作。

在我的ng-click函数中我有:

 var the_string = 'lifeMeaning'; if ($scope[the_string] === undefined) { //Valid in my application for first usage $scope[the_string] = true; } else { $scope[the_string] = !$scope[the_string]; } //$scope.$apply 

我已经testing了它,没有$ scope。$ apply。 没有它,正确工作!

从结果中创builddynamicangular度variables

 angular.forEach(results, function (value, key) { if (key != null) { $parse(key).assign($scope, value); } }); 

PS。 不要忘记将$ parse属性传递给你的控制器的函数

如果你可以使用Lodash,你可以使用_.set()在一行中做你想要的东西:

_.set(object,path,value)设置对象path的属性值。 如果path的一部分不存在,则创build它。

https://lodash.com/docs#set

所以你的例子只是: _.set($scope, the_string, something);

请记住:这只是一个JavaScript的东西,与Angular JS没有任何关系。 所以不要混淆神奇的$符号;)

主要的问题是这是一个层次结构。

 console.log($scope.life.meaning); // <-- Nope! This is undefined. => abc 

这是不确定的,因为“$ scope.life”不存在,但上面的术语想解决“意义”。

应该是一个解决scheme

 var the_string = 'lifeMeaning'; $scope[the_string] = 42; console.log($scope.lifeMeaning); console.log($scope['lifeMeaning']); 

或者更好一点。

 var the_string_level_one = 'life'; var the_string_level_two = the_string_level_one + '.meaning'; $scope[the_string_level_two ] = 42; console.log($scope.life.meaning); console.log($scope['the_string_level_two ']); 

既然你可以访问一个结构对象

 var a = {}; ab = "ab"; console.log(ab === a['b']); 

有几个关于这个好教程哪些指导你通过JavaScript的乐趣。

有一些关于

 $scope.$apply(); do...somthing...bla...bla 

去网上search'angular $ apply',你会发现有关$ apply函数的信息。 而且你应该更明智地使用这种方式(如果你不是一个$申请阶段alreay)。

 $scope.$apply(function (){ do...somthing...bla...bla }) 

只需要添加到给出的答案,以下为我工作:

HTML:

 <div id="div{{$index+1}}" data-ng-show="val{{$index}}"> 

$index是循环索引。

Javascript(其中value是传递给函数的参数,它将是$index ,current loop index的值):

 var variable = "val"+value; if ($scope[variable] === undefined) { $scope[variable] = true; }else { $scope[variable] = !$scope[variable]; } 

如果你试图做我想象中的事情,那么你只需要像普通的JS对象那样对待范围。

这是我用于JSON数据数组的API成功响应…

 function(data){ $scope.subjects = []; $.each(data, function(i,subject){ //Store array of data types $scope.subjects.push(subject.name); //Split data in to arrays $scope[subject.name] = subject.data; }); } 

现在{{subjects}}将返回一个数据主题名称数组,在我的示例中,$ scope将包含{{jobs}},{{customers}},{{staff}}等的scope属性。作业,$ s​​cope.customers,$ scope.staff