@givemoneybiatch
Немного веб, немного гейм

Как расширить массив в AngularJS?

Нашел в документации метод extend, но он не работает так как хочется с массивами, пример здесь jsfiddle.net/Lvc0u55v/11448
https://docs.angularjs.org/api/ng/function/angular...
Пытался сделать concat(), но для моей задачи наверное не подходит. Я делаю чат. При первой загрузке страницы чата, я получаю историю чата в виде массива и сохраняю в локальный массив в сервисе с помощью $rootScope.apply(), чтобы данные динамически улетали в контроллер. Проблема в том, что данные в контроллере не обновляются автоматически при получении новых сообщений. Если же для расширения массива использовать angular.extend, то проблема с отображением решается, но встает проблема та, что angular.extend просто затирает один массив другим, а не соединияет как хотелось бы.

UPD Приведу код из своего чата
Сервис , проблемное место
function chatService($rootScope, flashService) {
        var host = location.origin.replace(/^http/, 'ws');
        var socket = new WebSocket(host);
        var initialization = {
            token: localStorage.getItem("satellizer_token"),
            getHistory: true,
            index: $rootScope.chatIndex //index defined first time on server
        }
        socket.onopen = function(obj) {
            socket.send(JSON.stringify(initialization));
        };
        var self = this;
        self.live = [];
        self.error = false;
        socket.onmessage = function(obj) {
            var response = JSON.parse(obj.data);
            if (!response.error) {
                $rootScope.chatIndex = response.index;
                angular.forEach(response.data, function(value, key) {
                    response.data[key].date = response.data[key].date.substring(11, 19);
                });
                // if single msg
                if (response.data.length == 1) {
                    $rootScope.$apply(function() {
                        self.live.push(response.data[0]);
                        // console.log('single message from server', response.data[0]);
                    });
                } 
                      //if get history from server
                   else {
                    $rootScope.$apply(function() {
                        //!!! ПРОБЛЕМА ЗДЕСЬ !!!
                        angular.extend(self.live, response.data); // в контроллере новое сообщение видно, но стрирается старое в self.lve, мне надо сохранить старое и дописать туда новое ,т.е. было ['1'], пришло с сервера ['2','3'], в контроллер отдали ['1', '2', '3']
                        // self.live = self.live.concat(response.data); // в self.live нормально сохраняется новое сообщение, но в контроллер оно не попадает 
                    });
                }
            } else {
                $rootScope.$apply(function() {
                    self.error = true;
                    flashService.error(response.errorMessage, false);
                });
            }
        }
        self.msgSend = function(msg) {
            if (socket.readyState == 1) {
                socket.send(JSON.stringify(msg));
            }
        }
        self.getHistory = function() {
            initialization.index = $rootScope.chatIndex;
            initialization.getHistory = true;
            socket.send(JSON.stringify(initialization));
        }
    }

Контроллер. Если в сервисе concat , $scope.live пустое.
Если в сервисе extend(), $scope.live не пустое, но старые сообщения не сохраняются
function chatController($scope, chatService, flashService, $rootScope, $location) {
        $scope.msgSend = function() {
            if (!$scope.isError()) {
                flashService.clearFlashMessage();
                obj.text = $scope.textMsg;
                obj.date = moment().format("YYYY-MM-DD HH:mm:ss");
                obj.token = localStorage.getItem("satellizer_token");
                chatService.msgSend(obj);
                $scope.textMsg = '';
            }
        };
        $scope.getHistory = function() {
            chatService.getHistory();
        }
      //!!! ПРОБЛЕМА ЗДЕСЬ !!!
        // new messages
        $scope.live = chatService.live;
    }
  • Вопрос задан
  • 193 просмотра
Решения вопроса 1
zoonman
@zoonman
⋆⋆⋆⋆⋆
$scope.newArray = array1.concat(array2);
// можете добавить дополнительное слежение за изменением данных
$scope.$watch('newArray', function(newValue) {
  // делайте все, что хотите
  // хоть $scope.applyAsync();
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы