AngularJs обновляют неверные значения - PullRequest
1 голос
/ 27 марта 2019

Я пытаюсь добавить переменную (кнопка отмены с функцией) к $scope.dialogs.activeSelect.buttons[3], однако, как только я проверяю область действия, объект также добавляется к $scope.dialogs.manageprojects.buttons[3]. Это приводит к тому, что кнопка отмены дублируется при каждом вызове openSelectDialog. Нужно ли добавлять кнопку отмены при следующем обновлении области или я что-то упустил?

var app = angular.module('Application',[]);
app.controller('Main', function($scope, $http) {
    $scope.variables = {};
    $scope.functions = {};
    $scope.dialogs = {};

    $http.get("?action=inflate").then(function(response) {
        $scope.dialogs.manageprojects = {};
        $scope.dialogs.manageprojects.buttons = [];
        $scope.dialogs.manageprojects.buttons[0] = {};
        $scope.dialogs.manageprojects.buttons[0].name = "Open";
        $scope.dialogs.manageprojects.buttons[0].function = "";
        $scope.dialogs.manageprojects.buttons[1] = {};
        $scope.dialogs.manageprojects.buttons[1].name = "Rename";
        $scope.dialogs.manageprojects.buttons[1].function = "";
        $scope.dialogs.manageprojects.buttons[2] = {};
        $scope.dialogs.manageprojects.buttons[2].name = "Delete";
        $scope.dialogs.manageprojects.buttons[2].function = "";
        getData();
    });
    function getData() {
        $http.get("?action=get_file_structure").then(function(response) {
            $scope.dialogs.manageprojects.data = response.data;
        });
    }

    $scope.functions.openSelectDialog = function($Dialog) {
        $scope.dialogs.activeSelect = $Dialog;
        var cancelIndex = $Dialog.buttons.length;
        $scope.dialogs.activeSelect.buttons[cancelIndex] = {};
        $scope.dialogs.activeSelect.buttons[cancelIndex].name = "Cancel";
        $scope.dialogs.activeSelect.buttons[cancelIndex].function = function() {
            $scope.dialogs.activeSelect = {};
            console.log(getScope());
        };
        $scope.dialogs.activeSelect.show = true;
    };
});
function getScope() {
    $scope = angular.element(document).find('main').scope();
    $return_scope = {};
    $return_scope.variables = $scope.variables;
    $return_scope.functions = $scope.functions;
    $return_scope.dialogs = $scope.dialogs;
    return $return_scope;
}

1 Ответ

1 голос
/ 27 марта 2019

Я пытаюсь добавить переменную (кнопка отмены с функцией) к $scope.dialogs.activeSelect.buttons[3], однако, когда я проверяю область действия, он также добавляет объект к $scope.dialogs.manageprojects.buttons[3]

Вместо задания ссылки используйте angular.copy :

$scope.functions.openSelectDialog = function($Dialog) {
    ̶$̶s̶c̶o̶p̶e̶.̶d̶i̶a̶l̶o̶g̶s̶.̶a̶c̶t̶i̶v̶e̶S̶e̶l̶e̶c̶t̶ ̶=̶ ̶$̶D̶i̶a̶l̶o̶g̶;̶
    $scope.dialogs.activeSelect = angular.copy($Dialog);
    var cancelIndex = $Dialog.buttons.length;
    $scope.dialogs.activeSelect.buttons[cancelIndex] = {};
    $scope.dialogs.activeSelect.buttons[cancelIndex].name = "Cancel";
    $scope.dialogs.activeSelect.buttons[cancelIndex].function = function() {
        $scope.dialogs.activeSelect = {};
        console.log(getScope());
    };
    $scope.dialogs.activeSelect.show = true;
};

Функция angular.copy создает новый объект из исходного объекта. Изменения в новом объекте не влияют на исходный объект.

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