Javascript 从$scope访问嵌套变量属性的干净方法

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

我想在java脚本文件中访问相同的变量属性,但由于属性太多,代码看起来有点难看。我有下一个代码:

$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
?我的文件中有很多重复的代码,我想找到一种克莱纳方法来访问这样的属性


我知道当我需要这个值时,我可以定义变量var
operations=$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
,对吗?