Изменение значения вложенного объекта в AngularJS изменяет все остальные значения - PullRequest
0 голосов
/ 01 декабря 2019

Рассмотрим следующий вложенный объект, который циклически повторяется 10 раз для создания объекта с расписаниями на 10 недель для каждого понедельника в указанное время:

$rootScope.bookings_times_list = [];
for (i = 0; i < 10; i++) {    
    $rootScope.bookings_times_list.push({
        week: i,
        schedule: [{
            booking_day: "Monday",
            booking_times: [{
                "booking_start_time": "00:15",
                "booking_end_time": "01:00",
                "booking_selected": "",
                "booking_selected_date": "",
                "booking_time": "30 Nov 2019 07:35hrs"
            }]
        }]                         
    });
}

Проблема состоит в том, что значение booking_selected изменяется на1, как показано ниже, изменяет значения для всех booking_selected клавиш для каждой недели на 1:

$rootScope.bookings_times_list[0].schedule[0].booking_times[0].booking_selected = 1;

Почему это происходит, когда клавиша для $rootScope.bookings_times_list[0]четко установлено 0 только для первой недели?

==== ОБНОВЛЕНИЕ ====

Фактический код начинается с пустого времени бронирования, например:

$rootScope.bookings_times_list = [];
for (i = 0; i < 10; i++) {    
    $rootScope.bookings_times_list.push({
        week: i,
        schedule: [{
            booking_day: "Monday",
            booking_times: []
        }]                         
    });
}

Затем следует еще один цикл for, который объединяет понедельник и добавляет фактическое расписание, доступное из бронирования:

for (a = 0; a < $rootScope.bookings_times_list.length; a++) {
    for (y = 0; y < $rootScope.bookings_times_list[a].schedule.length; y++) {
        if($rootScope.business_bookings[$rootScope.bookings_index].booking_times[y]){
            var index = $rootScope.bookings_times_list[a].schedule.findIndex(x => x.booking_day === $rootScope.business_bookings[$rootScope.bookings_index].booking_times[y].booking_day);

            if(index >= 0){
                $rootScope.bookings_times_list[a].schedule.splice(index, 1, $rootScope.business_bookings[$rootScope.bookings_index].booking_times[y]);
            }
         }
    }
} 

Похоже, что второй цикл for является причиной проблемы. Влияет ли сплайсинг на инициализацию объекта?

=== ОБНОВЛЕНИЕ ===

Я также только что заметил, что проблема не в соединении. Потому что изменение с

$rootScope.bookings_times_list[a].schedule.splice(index, 1, $rootScope.business_directory_records[$rootScope.index].business_bookings[$rootScope.bookings_index].booking_times[y]);

на

$rootScope.bookings_times_list[a].schedule[index] = $rootScope.business_directory_records[$rootScope.index].business_bookings[$rootScope.bookings_index].booking_times[y]

во втором цикле for по-прежнему вызывает ту же проблему.

1 Ответ

0 голосов
/ 01 декабря 2019

Использование angular.copy:

 .splice(index, 1, angular.copy(monday));

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

Для получения дополнительной информации см.

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