服务如何知道注入它的控制器何时销毁?

时间:2016-03-01 06:28:58

标签: javascript angularjs

我有图书服务来搜索图书。 大部分时间服务,例如只提供20本书。

我希望服务器能够在控制器收到数据后更改屏幕上的书籍属性。

例如: 我有一个控制器,显示20本书的清单(来自搜索查询和限制属性)。

我希望服务器能够在控制器获取数据(实时更改)后更改控制器获得的书籍

controller($scope,bookService){
    $scope.data=bookService.getList(query,20)
}

service(function(){
  var dataBindedToController=[]
  return{
    getList:function(query,limit){
       dataBindedToController.push([{name:'book1'},{name:'book2'}])
       return dataBindedToController[dataBindedToController.length-1]
  }
  }
})

在上面的示例中,每次控制器询问书籍列表时,我都会通过引用将返回的数据添加到服务中。之后,例如,如果我在服务中执行:dataBindedToController[0][2].name='Moshe',它将自动更新控制器。控制器$scope.data === dataBindedToController[0]

现在的问题是:当控制器被破坏时,服务现在如何处理,并从其数组中删除bindedData?

我想尽快保持控制器(尽可能简单)。

另一个例子: 一个工作的JSFiddle,在控制器获取数据后使用绑定技术更新服务中的计数器: https://jsfiddle.net/tLLtn45j/

var app=angular.module('app',[])
.controller('a',function($scope,service){
  $scope.data=service
})
.service('service',function($interval){
  var data={counter:3}
  $interval(function(){data.counter++},500)
  return data
})

问题是:当控制器被销毁时,服务现在如何停止更新计数器

1 个答案:

答案 0 :(得分:1)

您可以像这样传递范围

controller($scope,bookService){
    $scope.data=bookService.getList($scope, query,20)
}

然后将$scope保存在您的服务中,然后在那里附加事件监听器。我不确定将$ scope传递给服务是否是一个好习惯,我认为它不是

您可以收听$destroy事件

$scope.$on('$destroy', function() {

   bookService.destroy($scope.$id);

})

您可能希望使用dataBindedToController$scope.$id编制索引,以便了解要移除的内容