Javascript 从$scope访问嵌套变量属性的干净方法
我想在java脚本文件中访问相同的变量属性,但由于属性太多,代码看起来有点难看。我有下一个代码:Javascript 从$scope访问嵌套变量属性的干净方法,javascript,angularjs,object,properties,nested-properties,Javascript,Angularjs,Object,Properties,Nested Properties,我想在java脚本文件中访问相同的变量属性,但由于属性太多,代码看起来有点难看。我有下一个代码: $scope.invoice = new Invoice(); $scope.operations = { editingLine: {}, isNewLine: false, isEditOpen: false }; $scope.modify = function (invoiceLine) { if ($scope.operations.isEditOpe
$scope.invoice = new Invoice();
$scope.operations = {
editingLine: {},
isNewLine: false,
isEditOpen: false
};
$scope.modify = function (invoiceLine) {
if ($scope.operations.isEditOpen) return;
let originalLine = $scope.invoice.invoiceLines.find(line => line.id = invoiceLine.id);
tempLine = angular.copy(originalLine);
$scope.operations.editingLine[invoiceLine.id] = true;
$scope.operations.isEditOpen = true;
};
是否有任何方法可以访问对象
发票上设置的属性invoiceLine
,或对象操作上设置的属性isEditOpen
?我的文件中有很多重复的代码,我想找到一种克莱纳方法来访问这样的属性
我知道当我需要这个值时,我可以定义变量varoperations=$scope.operations
并访问属性operations.isEditOpen
,但我仍然想要更简单的东西,因为我不想为作用域中的所有对象创建变量
有没有办法创建一个带有两个参数(objectFromScope,neededProperty
)的函数
,该函数可以从作用域上设置的变量返回所需的属性值?或者,当我想从作用域访问对象属性时,有没有更好的方法不需要这么多代码
PS:我也可以这样做:
let editingLine = $scope.operations.editingLine;
let isNewLine = $scope.operations.isNewLine;
let isEditOpen = $scope.operations.isEditOpen;
$scope.modify = function (invoiceLine) {
if (isEditOpen) return;
let originalLine = invoiceLines.find(line => line.id = invoiceLine.id);
tempLine = angular.copy(originalLine);
editingLine[invoiceLine.id] = true;
isEditOpen = true;
};
但这是一个好办法吗
有没有办法创建一个具有两个参数的函数(objectFromScope,neededProperty)
,可以从作用域上设置的变量返回所需的属性值?或者,当我想从作用域访问对象属性时,有没有更好的方法不需要这么多代码
是的,但我看不出这能帮你省事。这也会使切换到TypeScript变得更加困难(尽管如果不想取消对整个属性路径的引用,可以使用keyof
)
但这就是功能:
function getPropertyValue( objectFromScope, neededProperty ) {
const pathComponents = neededProperty.split( '.' );
let obj = objectFromScope;
for( const component of pathComponents ) {
obj = obj[ component ];
}
return obj;
}
用法:
$scope.invoice = new Invoice();
$scope.operations = {
editingLine: {},
isNewLine: false,
isEditOpen: false
};
$scope.modify = function( invoiceLine ) {
if ($scope.operations.isEditOpen) return;
const lines = getPropertyValue( $scope, 'invoice.invoiceLines' );
let originalLine = lines.find(line => line.id = invoiceLine.id);
tempLine = angular.copy(originalLine);
$scope.operations.editingLine[invoiceLine.id] = true;
$scope.operations.isEditOpen = true;
};
…但这并不能使您的代码更易于阅读或维护。相反,这样做会让事情变得更糟,因为这样做对于JavaScript和AngularJS来说是非常不习惯的:在这个项目上工作的任何其他人都会盯着代码看几分钟,搔搔头,然后大声问你为什么要这样做“因为我不想为作用域中的所有对象创建变量”-为什么不?顺便说一句,re:让editingLine=$scope.operations.editingLine;
-如果该代码在全局作用域中,那么它只会复制一次editingLine
。它不是该值的实时视图。”是否有任何方法可以访问对象发票上设置的属性invoiceLine
“-您的意思是invoiceLines
,而不是invoiceLine
,对吗?