我们如何从工厂广播更新的数据。 我有两个工厂和两个控制器。
Service1:将数据更新为db
app.factory('uac',function($http,$q, $cookies)
{
formData.uClient = function(data)
{
var client = $http.post('add_client/',data)
return $q.all({'response':client})
}
}
服务2:从db
获取客户端列表app.factory('adService',function($http, $q)
{
clientData = {}
clientData.getListofClients = function()
{
var listOfClients = $http.get('get_clients/')
return $q.all({'listOfClients':listOfClients})
}
return clientData
})
控制器1:将要更新的数据发送到服务
app.controller('acController', function($scope,uac)
{
$scope.clientDatadata = {name:"abcd"}
uac.uClient($scope.clientData)
}
控制器2:从服务
获取客户数据app.controller('getDetailsController',function($scope,adService)
{
adService.getListofClients().then(function(data)
{
$scope.clientList = data.listOfClients.data
console.log($scope.clientList)
},
function(error)
{
console.log("Can fetch data")
});
}
首先,我将调用getDetailsController来获取所有客户端,每当通过调用“acController”添加新客户端时,我想要更新“$ scope.clientList”中的客户端列表。我怎样才能完成它?
答案 0 :(得分:2)
您可以$emit来自发件人控制器的事件,并在接收器控制器中监听它。由于我不确定控制器的层次结构,我会听$ rootScope:
控制器1:将要更新的数据发送到服务
app.controller('acController', function($scope,uac)
{
$scope.clientDatadata = {name:"abcd"}
uac.uClient($scope.clientData).then(function(res){
$scope.$emit('serviceUpdated', res); // you can send data if you wish
});
}
控制器2:从服务
获取客户数据app.controller('getDetailsController',function($scope,adService,$rootScope)
{
function getList(){
adService.getListofClients().then(function(data)
{
$scope.clientList = data.listOfClients.data
console.log($scope.clientList)
},
function(error)
{
console.log("Can fetch data")
});
}
getList();
$rootScope.$on('serviceUpdated', getList);
}
答案 1 :(得分:0)
有三种方法可以解决这个问题:
-
myApp.factory('clientList', function () {
return [];
});
致电控制器2获取客户列表并保存在工厂:
app.controller('getDetailsController',function($scope,adService, clientList)
{
adService.getListofClients().then(function(data)
{
clientList = data;
},
function(error)
{
console.log("Can fetch data");
});
}
控制器1:将要更新的数据发送到服务并将返回的数据保存在clientList工厂
app.controller('acController', function($scope,uac, clientList)
{
$scope.clientDatadata = {name:"abcd"};
clientList = uac.uClient($scope.clientData);
}
关于此解决方案的问题是,在复杂的应用程序中,您不希望通过工厂公开数据。