Нашел в документации метод 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;
}