雖然這是可以理解的,你可能不希望更新您當前的架構,可能需要稍微調整您的來電如果你想能夠通過服務輕鬆地在控制器之間共享數據。
一種靈活的方法是將數據存儲在您的服務中,並在每個控制器中註冊觀察者。這使您可以從一個控制器(聯繫人控制器)調用服務更新,並將更改反映到所有使用控制器中。請注意,該服務被嘲笑。
你可以找到工作plunker示例here。
聯繫服務:
var app = angular.module('app', []);
app.service('contactsService', function ($http) {
var contacts = [];
return {
loadData: function() {
var mockGet = $q.defer();
var data = [
{ id: 1, name: 'Jack' },
{ id: 2, name: 'Jill' }
];
contacts = data;
mockGet.resolve(contacts);
return mockGet.promise;
},
retrieveNewData: function() {
var mockGet = $q.defer();
var data = [
{ id: 1, name: 'Jack' },
{ id: 2, name: 'Jill' },
{ id: 3, name: 'Bob' },
{ id: 4, name: 'Susan' }
];
contacts = data;
mockGet.resolve(contacts);
return mockGet.promise;
},
getContacts: function() {
return contacts;
}
}
});
聯繫控制器:
app.controller('ContactsCtrl', ['$scope', 'contactsService',
function ($scope, contactsService) {
var vm = this;
vm.contacts = [];
vm.loadData = loadData;
vm.retrieveNewData = retrieveNewData;
$scope.$watch(angular.bind(contactsService, function() {
return contactsService.getContacts();
}), function (newVal) {
vm.contacts = newVal;
});
function loadData() {
contactsService.loadData();
}
function retrieveNewData() {
contactsService.retrieveNewData();
}
}
]);
其他控制器:
app.controller('OtherCtrl', ['$scope', 'contactsService',
function($scope, contactsService) {
var vm = this;
vm.contacts = [];
$scope.$watch(angular.bind(contactsService, function() {
return contactsService.getContacts();
}), function (newVal) {
vm.contacts = newVal;
});
}
]);
如果你正在尋找讓畝當從服務器獲取數據時,多個控制器同步,您需要將數據本身保存在服務/工廠中。你可以通過在角度控制器之間使用'共享數據來查看如何做到這一點' – theaccordance
這意味着我必須改變我的邏輯。沒有其他辦法可以繼續使用當前結構嗎?| – vipanth
@vipanth與你目前的結構相比,你有點受限,因爲你依靠承諾解決方案,這是一個完成的操作。您需要一個可觀察點才能繼續接收更新的數據。但是,如果您將數據存儲更改爲服務,則每個控制器都可以在該數據上註冊一個觀察器,並在數據更改時進行更新。 –