从Angular JS中的另一个控制器触发一个控制器中的服务调用

时间:2016-05-17 19:37:24

标签: javascript angularjs angular-services angular-controller

我必须找到一个解决方案,但我不能。

我的申请中有三种状态。搜索,搜索结果和搜索详细信息。

在搜索页面中为搜索提供交易密钥后,

enter image description here

结果显示在UI网格的搜索结果页面上,并且交易状态为"等待批准"。

enter image description here

现在当我点击搜索结果页面上的交易密钥时..

我去了搜索详细信息页面。那是一个独立的控制器。

enter image description here

现在,搜索详细信息页面上的批准按钮...

应将交易状态更改为"已批准"从"等待批准"

它将通过后端的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);
    });
});

但这件事没有按预期工作?

有时会触发事件并且警报会多次显示。

实现同样的任何其他替代/更标准的方式?

2 个答案:

答案 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');

请注意,您的控制器必须至少加载一次才能注册处理程序。

使用app.run()

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');
相关问题