【发布时间】:2015-04-13 11:57:39
【问题描述】:
我正在一个有角度的应用程序中工作,我正在传递一个对象和一个点表示法的字符串。例如:
$scope.obj = {
x: 1,
y: 'a',
z: {
eks: 1,
why: 'a',
zee: 'orange you glad i didn\'t say banana'
}
};
$scope.key = 'z.zee'
我希望能够从对象中获取键的值。由于密钥是一个字符串,我必须构建一个函数
$scope.getValue = function (object, expression) {
return $parse(expression)(this, object);
};
函数获取值,但现在我需要能够将 obj.z.zee 设置为别的东西,但我做不到
$scope.getValue($scope.obj, "z.zee.punchLine") = 'something else';
或
$scope.val = $scope.getValue($scope.obj, "z.zee.punchLine");
$scope.val = 'something else';
第一个是错误,第二个只会改变val。
我试图创建一个不依赖于 Angular 解析的函数,但它也没有帮助
function getValue(object, expression) {
var expresionList = expression.split('.');
var value = object;
for(var index = 0; index < expresionList.length; index++) {
value = value[expresionList[index]];
}
return value
}
当对象的点路径为字符串时,有没有办法回写到对象?
这里有一个 Plunker 和 sn-p 可以玩。
angular.module('SimpleApp', [])
// Attribute Isolated Scope
.controller('simpleCtrl', function($scope, $parse) {
$scope.testCtrlScope = 'test controller scope';
$scope.obj = {
x: 1,
y: 'a',
z: {
eks: 1,
why: 'a',
zee: {
punchLine: 'orange you glad i didn\'t say banana'
}
}
};
$scope.getValue = function(object, expression) {
return $parse(expression)(this, object);
};
//alt get value
// $scope.getValue = function (object, expression) {
// var expresionList = expression.split('.');
// var value = object;
// for(var index = 0; index < expresionList.length; index++) {
// value = value[expresionList[index]];
// }
// return value;
// };
$scope.val = $scope.getValue($scope.obj, "z.zee.punchLine");
console.log($scope.val, $scope.getValue($scope.obj, "z.zee.punchLine"));
$scope.val = 'something';
console.log($scope.val, $scope.getValue($scope.obj, "z.zee.punchLine"));
});
<div ng-app="SimpleApp">
<div ng-controller="simpleCtrl">
{{testCtrlScope}}
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
编辑:doldt 的回答有效。这是我如何使它以角度工作
$scope.setValue = function(object, expression, value) {
var firstPart = expression.substr(0, expression.lastIndexOf('.'));
var obj;
var setterKey;
if (firstPart) {
setterKey = expression.substr(expression.lastIndexOf('.') + 1);
obj = $parse(firstPart)(this, object);
} else {
obj = object;
setterKey = expression;
}
obj[setterKey] = value;
};
【问题讨论】:
标签: javascript angularjs object key