在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它。
所以你的例子只是: _.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属性。作业,$ scope.customers,$ scope.staff