我必须找到一个解决方案,但我不能。
我的申请中有三种状态。搜索,搜索结果和搜索详细信息。
在搜索页面中为搜索提供交易密钥后,
结果显示在UI网格的搜索结果页面上,并且交易状态为"等待批准"。
现在当我点击搜索结果页面上的交易密钥时..
我去了搜索详细信息页面。那是一个独立的控制器。
现在,搜索详细信息页面上的批准按钮...
应将交易状态更改为"已批准"从"等待批准"
它将通过后端的StoredProcedure完成。
所以我所要做的就是
我必须以某种方式更新搜索结果页面,以反映“已批准”状态而不是“等待批准”。
但它们是Angular中的独立控制器。
我怎样才能做到这一点?
更新
到目前为止我做了什么,没有用,是.........
单击批准按钮并返回结果(即,现在批准交易)
我再次通过$ rootScope启动交易搜索。$ broadcast
var searchResultsParam = TransactionDataServices.getSavedSearchParams();
console.log("Search Results Params that are set ...");
console.log(searchResultsParam);
//Fire the transaction search again
$rootScope.$broadcast('gridRefreshMergeResult', searchResultsParam);
myApp.hidePleaseWait();
$("#accessDeniedModal").modal('show');
并在SearchResult的控制器上捕捉到它。
$rootScope.$on('gridRefreshMergeResult', function (event, arg) {
window.alert("Fired from merge");
console.log("In Event Args after broadcast from Merge");
console.log(arg);
//Fire the search again
TransactionServices.getTransactionAdvSearchResults(arg).then(function (result) {
console.log("Trans Search Results");
console.log(result);
//Set the Grid UI data again
$scope.searchResultsGridOptions.data = '';
$scope.searchResultsGridOptions.data = result;
TransactionDataServices.setSearchResultsData(result);
});
});
但这件事没有按预期工作?
有时会触发事件并且警报会多次显示。
实现同样的任何其他替代/更标准的方式?
答案 0 :(得分:0)
嗯,这是一种方法。单击“批准”并获得批准的记录后,您可以检索已批准的记录,然后发送包含更新数据的广播。搜索控制器接收广播,然后使用其索引更新更新的记录。
//search results controller
$scope.editRecord = function(record){
$scope.editRecordIndex = $scope.searchResults.indexOf(record);
//Edit record state
$state.go("editRecord");
}
$scope.$on("RECORD_UPDATED",function(source,args){
$scope.searchResults[editRecordIndex] = args;
});
//record approval controller
$scope.approve = function(record) {
TransactionDataService.approve(record).then(function(response){
$rootScope.$broadcast("RECORD_UPDATED",response.record);
})
}
答案 1 :(得分:0)
我通常使用$ rootScope和事件来做同样的事情,确保你只注册gridRefreshMergeResult的事件处理程序一次,有两种方法可以保证,通过执行$ rootScope。$ on()代码在控制器定义或app.run()中:
angular.module('myApp', [])
.controller('myCtrl', function($scope, $rootScope, TransactionServices) {
// directly put your event handler registration here:
$rootScope.$on('gridRefreshMergeResult', function (event, arg) {
window.alert("Fired from merge");
console.log("In Event Args after broadcast from Merge");
console.log(arg);
//Fire the search again
TransactionServices.getTransactionAdvSearchResults(arg).then(function (result) {
console.log("Trans Search Results");
console.log(result);
//Set the Grid UI data again
$scope.searchResultsGridOptions.data = '';
$scope.searchResultsGridOptions.data = result;
TransactionDataServices.setSearchResultsData(result);
});
});
});
你可以用你写的方式解雇它:
var searchResultsParam = TransactionDataServices.getSavedSearchParams();
console.log("Search Results Params that are set ...");
console.log(searchResultsParam);
//Fire the transaction search again
$rootScope.$broadcast('gridRefreshMergeResult', searchResultsParam);
myApp.hidePleaseWait();
$("#accessDeniedModal").modal('show');
请注意,您的控制器必须至少加载一次才能注册处理程序。
angular.module('myApp')
.run(function($rootScope, TransactionServices) {
$rootScope.$on('gridRefreshMergeResult', function (event, arg) {
window.alert("Fired from merge");
console.log("In Event Args after broadcast from Merge");
console.log(arg.arg);
//Fire the search again
TransactionServices.getTransactionAdvSearchResults(arg.arg).then(function (result) {
console.log("Trans Search Results");
console.log(result);
//Set the Grid UI data again
args.scope.searchResultsGridOptions.data = '';
args.scope.searchResultsGridOptions.data = result;
TransactionDataServices.setSearchResultsData(result);
});
});
});
});
使用app.run(),你必须在args中传递$ scope:
var searchResultsParam = TransactionDataServices.getSavedSearchParams();
console.log("Search Results Params that are set ...");
console.log(searchResultsParam);
//Fire the transaction search again
$rootScope.$broadcast('gridRefreshMergeResult',{arg: searchResultsParam, scope: $scope }); // you have to provide a reference to current $scope.
myApp.hidePleaseWait();
$("#accessDeniedModal").modal('show');