这是第一次,很抱歉出现混乱或长文本。
我将$scope.alertsensorconfigs作为tableData传递给我的服务,当我删除一个项目时,我的$scope.alertensorconfigs发生了更改,但当它尝试重新加载表时,我发现 tableData详细说明: 我有一个网站,它使用NgTable在不同的页面中创建了很多表,但转换和过滤我想在页面中显示的数据的所有逻辑都在页面中进行了编码,它重复了很多次,但它确实有效,所以我决定你做一个服务来做所有这些。 所以我的问题是,我创建了这个服务,它几乎都像以前一样工作,但我注意到,当我从表中删除一个项目时,它会删除数据,但会一直显示在表上,直到我重新加载页面。 我注意到,这是因为即使我在页面上的对象在删除后也发生了变化,如果它在我的服务中,对象apear就是不变的,因为我把我的对象作为参数传递给了我的服务,我把它当作对对象的引用,当它在页面上发生变化时,它在我服务中也会发生变化,但看起来情况并非如此,它看起来像是第一次调用wen,我的服务它复制了我的对象,而它再次调用时,它不会得到更新的对象。 我的页面代码。 在我的页面中删除功能: 我的服务: 以及删除后重新加载表格的ng表格功能: 有什么方法可以确保每次调用作为服务参数的对象时都会更新,比如绑定?$scope.funcFilter = function(pfilter){
return function (item) {
return item.name.toUpperCase().indexOf(pfilter) >= 0
||
item.criticality1.toString().toUpperCase().indexOf(pfilter) >= 0
||
item.criticality2.toString().toUpperCase().indexOf(pfilter) >= 0
|| $filter('translate')
(item.active.toString().toUpperCase()).indexOf(pfilter) >= 0;
}
}
$scope.searchTable = {filter: ""};
$scope.tableParams =
NgTableDataService.getGenericTableParams($scope.alertsensorconfigs,
$scope.funcFilter, $scope.searchTable.filter)
AlertSensorConfig.remove({id: obj.id}, function () {
$scope.alertsensorconfigs.splice($scope.alertsensorconfigs.indexOf(obj), 1);
$scope.tableParams.reload().then(function(data) {
if (data.length === 0 && $scope.tableParams.total() > 0) {
$scope.tableParams.page($scope.tableParams.page() - 1);
$scope.tableParams.reload();
}
});
},
angular.module('control-room').service('NgTableDataService',
function ($filter, NgTableParams, Session) {
var session = Session.get();
this.getGenericTableParams = function(tableData, funcFilter, searchTableFilter){
return new NgTableParams({
count: session.user.tablePagination,
filter: searchTableFilter
}, {
counts: rowsPerPageTemplate,
getData: function (params) {
if (params.filter() == ''){
var pfilter = '';
}else{
var pfilter = params.filter().filter.toUpperCase();
}
let filteredData = params.filter() ? $filter('filter')(tableData, funcFilter(pfilter)) : tableData;
if (!!filteredData && filteredData.length >= 0) {
params.total(filteredData.length);
var rowsPerPageTemplateWithAllData = rowsPerPageTemplate.slice();
var isFound = rowsPerPageTemplateWithAllData.some(function (element) {
return element === filteredData.length;
});
params.settings().counts = rowsPerPageTemplateWithAllData.filter(item=>item<filteredData.length)
if (filteredData.length >= 5){
params.settings().counts.push(filteredData.length);
}
rowsPerPageTemplateWithAllData.push(filteredData.length + (isFound ? 1 : 0));
if (session.user.tablePagination >= params.settings().counts[params.settings().counts.length-1]){
params.settings().count = params.settings().counts[params.settings().counts.length-1];
}else{
params.settings().count = session.user.tablePagination;
}
if (params.total() <= params.count()) {
params.page(1);
}
var x = $filter('orderBy')(filteredData, params.orderBy());
var y = x.slice((params.page() - 1) * params.count(), params.page() * params.count());
return y;
} else {
params.settings().counts = [];
return null;
}
}
});
};
this.reload = function() {
var self = this,
pData = null;
settings.$loading = true;
prevParamsMemento = angular.copy(createComparableParams());
isCommittedDataset = true;
if (self.hasGroup()) {
pData = runInterceptorPipeline($q.when(settings.getGroups(self)));
} else {
pData = runInterceptorPipeline($q.when(settings.getData(self)));
}
log('ngTable: reload data');
var oldData = self.data;
return pData.then(function(data) {
settings.$loading = false;
errParamsMemento = null;
self.data = data;
event even when data === oldData
ngTableEventsChannel.publishAfterReloadData(self, data, oldData);
self.reloadPages();
return data;
}).catch(function(reason){
errParamsMemento = prevParamsMemento;
// "rethrow"
return $q.reject(reason);
});
};
我想我设法解决了它。
NgTable有自己的reload(),但它不起作用,因为它所做的是,获取当前的filteredData并替换为一个tableDataableData是在第一次被调用时设置的,并且在我更新$scope.alersensorconfigs时没有得到更新。
因此,在经历了很多头痛之后,我设法在我的服务中创建:一个varserviceTableData,它接收$scope.alertsensorconfigs当调用服务时,它在我的服务中是全局的。以及我自己的reload()函数,我在我的控制器使用NgTable relload()的每个地方都替换了它。
调用的服务reload()从控制器接收$scope.alertsensorconfigs作为参数。在控制器删除或编辑项目后,它将serviceTableData设置为作为param接收的更新数据,然后调用NgTable reload。
结果是这样的:
angular.module().service('NgTableDataService',
function ($filter, NgTableParams, Session, MY_CONSTANTS) {
var session = Session.get();
var serviceTableParam = null;
var serviceTableData = null;
this.reloadTableData = function (tableDataAtt){
serviceTableData = tableDataAtt;
serviceTableParam.reload().then(function(data) {
if (data.length === 0 && serviceTableData.total() > 0) {
serviceTableParam.page(serviceTableParam.page() - 1);
serviceTableParam.reload();
}
return this.tableData = tableDataAtt;
});
};
this.getGenericTableParams = function(tableData, searchTableFilter, funcFilter){
serviceTableData = tableData;
return serviceTableParam = new NgTableParams({
// etc...
编辑:我误解了这个问题
根据您的评论,您想要的是更新服务中的一个变量,然后再检索它。
你能做的是:
-
在您的服务
angular .module('app.core') .factory('', dataservice); dataservice.$inject = ['$http']; function dataservice($http) { return { myFunction: yourServiceFunction, myData: myData }; var myData = []; function yourServiceFunction(tableData) { // DO SOMETHING myData = tableData; // DO SOMETHING } }
像这样,您可以访问服务或控制器中的myData
,该控制器在您的函数中更新为您调用函数时传递的tableData
值。
如果您想在每次$scope.alertsensorconfigs
更改时更新服务中的myData
,请向该变量添加一个$watch
,并在服务中创建一个函数,只要您的$scope值更改,就会调用该函数,该函数只需更新服务中myData
。
我希望这次我回答的问题是正确的:)
。.
在此之后:不回答问题的旧响应
有什么方法可以确保每次调用作为服务参数的对象时都会更新,比如绑定?
是。
很抱歉没有用你的代码回答,但这有点难理解。
最简单的方法是这样做:
$scope.alertsensorconfigs =
yourService.yourMethod($scope.alertsensorconfigs, param2, param3).tableData;
而您的服务的方法类似于:
yourMethod = function (tableData, param2, param3) {
// DO SOMETHING
return { tableData : tableDataAfterModification, elem2 : 'elem2', elem3 : 'elem3' };
};