AngularJS:我们如何向不同的控制器广播承诺?

时间:2015-01-30 12:02:18

标签: javascript angularjs angularjs-service angularjs-controller angularjs-factory

我们如何从工厂广播更新的数据。 我有两个工厂和两个控制器。

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”中的客户端列表。我怎样才能完成它?

2 个答案:

答案 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)

有三种方法可以解决这个问题:

  1. (easy)创建一个包含客户列表的工厂,并直接在您的视图中使用它。
  2. -

    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);
    }
    

    关于此解决方案的问题是,在复杂的应用程序中,您不希望通过工厂公开数据。

    1. 在工厂中实施getter和setter,这样您就不会将数据暴露给视图,而是让它们由控制器控制(使用$watch)。

    2. 按@Shomz的答案解释使用$emit。但是,我建议在收到发射后再提出另一个获取清单请求。我宁愿广播更新的数据(在这种情况下是发布/更新请求的响应),而是更新绑定到视图的变量。