我遇到了在我的应用中多次触发共享数据服务的问题,现在我将尝试解释它。
在带有控制器'home'的主页上,用户可以选择三个菜单项中的一个,在用户选择了其中一个项目(例如第一个)后,他将重定向到该视图,并带有自己的控制器'表”。视图底部有一个表格和标签,每个标签都有自己的控制器'tab1等'。通过单击行我在选项卡的控制器之间共享此行的ID,该选项卡可以加载与此特定行相关的内容。现在一切都运作良好。
接下来,当用户点击按钮回家时,他正在重定向到主页,如果他再次点击项目(例如第一个),共享服务将被触发两次并将返回相同的id两次,第三次共享服务将触发3次等等。
在我的代码下面,我很感激有人可以解释我,我缺少什么。提前谢谢。
app.controller('table', [
'$scope', 'tab1ID', 'tab2ID', 'tab3ID'
function ($scope, tab1ID, tab2ID, tab3ID) {
$scope.rowSelection($scope, function (row) {
tab1ID.setId(row.id);
tab2ID.setId(row.id);
tab3ID.setId(row.id)
});
app.controller('tab1', [
'$scope', 'tab1ID', dataService
function ($scope, tab1ID, dataService) {
tab1ID.getId().then(null, null, function (id) {
// return increment count of 'id' after redirecting from home view to table view
// dataService firing for each incremented id (1 for 1, 2 for 2 and etc)
dataService.rowData(id)
.then(function (res) {
$scope.data = res;
})
});
.factory(
'tab1ID', function ($q) {
var self = this,
defer = $q.defer();
this.share = '';
return {
getId: function () {
return defer.promise;
},
setId: function (id) {
self.share = id;
defer.notify(self.share);
}
}
}
);
答案 0 :(得分:1)
所以最后我想出了如何击败多次触发。我添加了为即将到来的id声明了一个新变量,并设置了角度监视以跟随该变量的变化。可能这是一个丑陋的方法,但它适用于我
tab1ID.getId().then(null, null, function(id){
$scope.id = id
});
$scope.$watch('id', function (newVal, oldVal) {
if (typeof newVal !== 'undefined') {
dataService.rowData(id)
.then(function (res) {
$scope.data = res;
})
})