使用$ rootScope和$ broadcast在函数之间进行通信

时间:2017-09-29 15:00:11

标签: javascript angularjs

在我的应用程序中,我有一个页面,显示可以删除文档的特定用户文档的详细信息,以及显示用户最近查看过的文档的另一个页面的详细信息。我试图这样做,当用户删除视图页面中的文档时,它也会删除用户最近查看的文档历史记录中的列表。

我试图使用$ broadcast和$ rootScope在两个模块之间进行通信,但我怀疑我对语法做错了,或者是范围或项目结构存在问题。

这是删除不同条目的两个独立函数

history.js

# Crystal Reports xml2 Parser
library(xml2)
library(dplyr)

# Get the .atomsvc file from the Export to Data Feed Option on the PA DEP website
pa_string <- '<service xmlns:atom="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xmlns="http://www.w3.org/2007/app"><workspace><atom:title>Oil_Gas_Well_Production</atom:title><collection href="http://www.depreportingservices.state.pa.us/ReportServer?%2FOil_Gas%2FOil_Gas_Well_Production&amp;P_PERIOD_ID=198&amp;P_COUNTY%3Aisnull=True&amp;P_CLIENT%3Aisnull=True&amp;P_PERMIT_NUM%3Aisnull=True&amp;P_OGO_NUM%3Aisnull=True&amp;P_PRODUCING%3Aisnull=True&amp;rs%3AParameterLanguage=&amp;rs%3ACommand=Render&amp;rs%3AFormat=ATOM&amp;rc%3ADataFeed=xAx0x2"><atom:title>Tablix1</atom:title></collection></workspace></service>'

pa_list <- pa_string %>% read_xml() %>% as_list()

documentView.js

//gets the selected item the user clicks and deletes it and updates history
$scope.removeFavorite = function(item) {
  var items = $scope.recent[item.type];

  item = items.splice(items.indexOf(item), 1)[0];

  $rootScope.$on('deleteRecent', function(data) {
    historyManager.remove(data);
  });

  historyManager.remove(item).then(loadHistoryItems, loadHistoryItems);
};

1 个答案:

答案 0 :(得分:0)

鉴于您的rootScope注射很好,您的问题部分就是这个:

$scope.removeFavorite = function(item) {
  var items = $scope.recent[item.type];

  item = items.splice(items.indexOf(item), 1)[0];

  $rootScope.$on('deleteRecent', function(data) {
    historyManager.remove(data);
  });

  historyManager.remove(item).then(loadHistoryItems, loadHistoryItems);
};

首先,如果你使用$ rootScope进行广播,可以在任何$ scope上接收消息,除此之外,你不要将它包装到$ scope的函数中,第一个参数是event。

所以正确的代码看起来像这样:

$scope.$on('deleteRecent', function(event, data) {
    historyManager.remove(data);
});

$scope.removeFavorite = function(item) {
  var items = $scope.recent[item.type];

  item = items.splice(items.indexOf(item), 1)[0];



  historyManager.remove(item).then(loadHistoryItems, loadHistoryItems);
};