AngularJS - это значение для несвязанной переменной области видимости - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть следующий угловой код для инициализации угловой формы.Он возвращает практически нулевую запись, за исключением пары дат и информации о сотруднике.

Я пытался создать переменную области действия, чтобы сохранить исходную запись для целей сравнения после заполнения формы.Для этого и используется $ scope.TechSheetInfoStatic.

Для наших целей я установил для $ scope.TechSheetInfo.Customer.Email пустое значение.При обновлении $ scope.TechSheetInfo также обновляется $ scope.TechSheetInfoStatic .Почему?

     $scope.initializeTechSheet = function() {
        $scope.TechSheetInfo = [];
        $scope.TechSheetInfoStatic = [];
        $scope.customerIDDisabled = false;
        $scope.orderIDDisabled = false;

        const successFunction = function(response) {
            $scope.TechSheetInfo = response.data;
            $rootScope.customerInfo = response.data.Customer;
            $scope.TechSheetInfoStatic = response.data;
            $scope.TechSheetInfo.Customer.Email = "bobo@bobo.com";
            alert(JSON.stringify($scope.TechSheetInfo.Customer));
            alert(JSON.stringify($scope.TechSheetInfoStatic.Customer));

        };

        const failureFunction = function(response) {
            //console.log('Error' + response.status);
        };

        TechSheetFactory.ITS(successFunction, failureFunction);
    };

1 Ответ

0 голосов
/ 13 ноября 2018

Используйте angular.copy для создания глубокой копии:

   const successFunction = function(response) {
        $scope.TechSheetInfo = response.data;
        $rootScope.customerInfo = response.data.Customer;
        ̶$̶s̶c̶o̶p̶e̶.̶T̶e̶c̶h̶S̶h̶e̶e̶t̶I̶n̶f̶o̶S̶t̶a̶t̶i̶c̶ ̶=̶ ̶r̶e̶s̶p̶o̶n̶s̶e̶.̶d̶a̶t̶a̶;̶
        $scope.TechSheetInfoStatic = angular.copy(response.data);
        $scope.TechSheetInfo.Customer.Email = "bobo@bobo.com";
        alert(JSON.stringify($scope.TechSheetInfo.Customer));
        alert(JSON.stringify($scope.TechSheetInfoStatic.Customer));
    };

Поскольку response.data является объектом.Оператор присваивания присваивает справочное значение переменной.Функция angular.copy создаст новый объект и скопирует содержимое в новый объект.

Переменная, содержащая объект, не "непосредственно" удерживает объект.То, что он содержит, является ссылкой на объект.Когда вы назначаете эту ссылку из одной переменной в другую, вы создаете копию этой ссылки.Теперь обе переменные содержат ссылку на объект.Изменение объекта через эту ссылку изменяет его для обеих переменных, содержащих ссылку на этот объект.

Для получения дополнительной информации см. Передача по ссылке объектов JavaScript .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...