Angularjs 如何在angular ui grid中传递所选行项目以获取另一ui grid的数据

Angularjs 如何在angular ui grid中传递所选行项目以获取另一ui grid的数据,angularjs,controller,angular-ui-grid,Angularjs,Controller,Angular Ui Grid,我有两个ui网格,使用两个不同的控制器显示数据,每个控制器调用不同的服务。(服务使用ngresource而不是http。) 我的需求是:当在第一个网格(供应商)中选择一行时,第二个网格(合同)应该只在值与在第一个网格中获取的id匹配的地方获取数据。 因此,基本上,当触发第一个网格供应商$scope.gridApi.selection.on.rowSelectionChanged事件时,contracts.query应该使用所选行的VEID值触发。 我是angular的新手,因此无法准确地指出在哪

我有两个ui网格,使用两个不同的控制器显示数据,每个控制器调用不同的服务。(服务使用ngresource而不是http。) 我的需求是:当在第一个网格(供应商)中选择一行时,第二个网格(合同)应该只在值与在第一个网格中获取的id匹配的地方获取数据。 因此,基本上,当触发第一个网格供应商$scope.gridApi.selection.on.rowSelectionChanged事件时,contracts.query应该使用所选行的VEID值触发。 我是angular的新手,因此无法准确地指出在哪里传递值以及在哪里添加函数来实现这一点。我看到了关于$emit和$on的文章,但不清楚。此外,我的服务使用$ngresource和查询方法,而大多数示例都使用$http或POST方法。请帮忙

//app.js
(功能(){
"严格使用",;
angular.module('VendorApp'、['ui.grid'、'ui.grid.pagination'、'ui.grid.selection'、'ang_venservice'、'ang_contservice'、'ui.grid.pinning']);
})();
//供应商控制员
(功能(){
"严格使用",;
有棱角的
.module('VendorApp')
.控制器(“ang_-vencontroller”,ang_-vencontroller);
ang_vencontroller.$inject=['$scope','vendors','contracts','$timeout','uiGridConstants'];
函数和控制器($scope、$rootscope、vendors、$timeout、uiGridConstants)
{
$scope.vendorsvalues=vendors.query()
$scope.gridOptions={
enableRowHeaderSelection:false,
多选:错,
enableRowSelection:true,
enableSelectAll:true,
enableSorting:true,
启用筛选:正确,
启用分页:true,
启用分页控件:true,
页码当前页码:1,
分页PageSize:100,
maxVisibleColumnCount:200,
columnDefs:[
{name:'VENDORID',字段:'MVE_VEID'},
{name:'name',字段:'VE_name'},
{name:'ADDR1',字段:'VE_ADDR1'}
],
数据:$scope.vendorsvalues
};
$scope.gridOptions.onRegisterApi=函数(gridApi){
$scope.gridApi=gridApi;
$timeout(函数(){
$scope.gridApi.selection.on.rowSelectionChanged($scope,function(row){
$scope.value=row.entity.MVE\u VEID;
$scope.mySelectedRows=$scope.gridApi.selection.getSelectedRows();
//$scope.contractvalues=function(){$rootScope.$emit(contracts.query({id:$scope.value}))};
});
//合同控制员
(功能(){
"严格使用",;
有棱角的
.module('VendorApp')
.控制器(“ang_contcontroller”,ang_contcontroller);
ang_contcontroller.$inject=['$scope','contracts'];
函数ang_contcontroller($scope、$rootscope、contracts){
$scope.contractvalues=contracts.query({id:$scope.value});
$scope.gridoptions2={
enableRowHeaderSelection:false,
多选:错,
enableRowSelection:true,
enableSelectAll:true,
enableSorting:true,
启用筛选:正确,
启用分页:true,
启用分页控件:true,
页码当前页码:1,
分页PageSize:100,
maxVisibleColumnCount:200,
columnDefs:[
{name:'construcd',字段:'MCO_COID'},
{name:'name',字段:'CO_DESC'},
{name:'VENDORID',字段:'MCO_VEID'}
],
数据:$scope.contractvalues
};
}
})();
//合同服务
(功能(){
"严格使用",;
var ang_contservice=angular.module('ang_contservice',['ngResource']);
ang_contservice.factory('contracts',['$resource',function($resource)
{
返回$resource('/api/ContractsAPI/:id',{id:0},{query:{method:'GET',params:{},isArray:true});
}])
})();

卖主
SelectedRowCount:

所选供应商:

合同
我让它工作了。 我必须让两个网格在同一个控制器中,这就解决了问题

这是因为$scope.GridApi在控制器之间不可用。 U可能能够使用控制器AS实现网格在不同控制器中交互,但现在,这符合我的目的。 以下是工作控制器代码:

(function () {
'use strict';

angular
    .module('VendorApp')
    .controller('ang_vencontroller', ang_vencontroller);
ang_vencontroller.$inject = ['$scope','$rootScope', 'vendors','contracts','$timeout', 'uiGridConstants'];


function ang_vencontroller($scope, $rootScope, vendors, contracts, $timeout, uiGridConstants) {
    $scope.value = 0;
    $scope.vendorsvalues = vendors.query();

    $scope.gridOptions = {
        enableRowHeaderSelection: false,
        multiSelect: false,
        enableRowSelection: true,
        enableSelectAll: true,
        enableSorting: true,
        enableFiltering: true,
        enablePagination: true,
        enablePaginationControls: true,
        paginationCurrentPage: 1,
        paginationPageSize: 100,
        maxVisibleColumnCount: 200,
        columnDefs: [
          { name: 'VENDORID', field: 'MVE_VEID' },
          { name: 'NAME', field: 'VE_NAME' },
          { name: 'ADDR1', field: 'VE_ADDR1' }
        ],
        data: $scope.vendorsvalues

    };

    $scope.gridOptions.onRegisterApi = function (gridApi) {
            $scope.gridApi = gridApi;
            console.info("grid api 1 registered", $scope.gridApi);

            $timeout(function () {
                $scope.gridApi.selection.selectRow($scope.gridOptions.data[0]);
                $scope.mySelectedRows = $scope.gridApi.selection.getSelectedRows();
                $scope.value = $scope.mySelectedRows[0].MVE_VEID;

                $scope.gridApi.selection.on.rowSelectionChanged($scope, function (row) {
                $scope.value = row.entity.MVE_VEID;
                $scope.contractvalues = contracts.query({ id: $scope.value });
                console.log("scope.contractvalues:", $scope.contractvalues);
                $scope.gridoptions2.data = $scope.contractvalues;
                $scope.gridApi2.core.notifyDataChange(uiGridConstants.dataChange.ALL);
            });
        });
    };

    $scope.contractvalues = contracts.query({ id: $scope.value });
    $scope.gridoptions2 = {
        enableRowHeaderSelection: false,
        multiSelect: false,
        enableRowSelection: true,
        enableSelectAll: true,
        enableSorting: true,
        enableFiltering: true,
        enablePagination: true,
        enablePaginationControls: true,
        paginationCurrentPage: 1,
        paginationPageSize: 100,
        maxVisibleColumnCount: 200,
        columnDefs: [
          { name: 'CONTRACTID', field: 'MCO_COID' },
          { name: 'NAME', field: 'CO_DESC' },
          { name: 'VENDORID', field: 'MCO_VEID' }
        ],
        data: $scope.contractvalues,
        onRegisterApi: function (gridApi) {
            $scope.gridApi2 = gridApi;
        }

    };
    $scope.gridoptions2.onRegisterApi = function (gridApi) {
        $scope.gridApi2 = gridApi;
        console.info("***grid api 2 registered***", $scope.gridApi2);

    };

}
})();
我让它工作了。 我必须让两个网格在同一个控制器中,这就解决了问题

这是因为$scope.GridApi在控制器之间不可用。 U可能能够使用控制器AS实现网格在不同控制器中交互,但现在,这符合我的目的。 以下是工作控制器代码:

(function () {
'use strict';

angular
    .module('VendorApp')
    .controller('ang_vencontroller', ang_vencontroller);
ang_vencontroller.$inject = ['$scope','$rootScope', 'vendors','contracts','$timeout', 'uiGridConstants'];


function ang_vencontroller($scope, $rootScope, vendors, contracts, $timeout, uiGridConstants) {
    $scope.value = 0;
    $scope.vendorsvalues = vendors.query();

    $scope.gridOptions = {
        enableRowHeaderSelection: false,
        multiSelect: false,
        enableRowSelection: true,
        enableSelectAll: true,
        enableSorting: true,
        enableFiltering: true,
        enablePagination: true,
        enablePaginationControls: true,
        paginationCurrentPage: 1,
        paginationPageSize: 100,
        maxVisibleColumnCount: 200,
        columnDefs: [
          { name: 'VENDORID', field: 'MVE_VEID' },
          { name: 'NAME', field: 'VE_NAME' },
          { name: 'ADDR1', field: 'VE_ADDR1' }
        ],
        data: $scope.vendorsvalues

    };

    $scope.gridOptions.onRegisterApi = function (gridApi) {
            $scope.gridApi = gridApi;
            console.info("grid api 1 registered", $scope.gridApi);

            $timeout(function () {
                $scope.gridApi.selection.selectRow($scope.gridOptions.data[0]);
                $scope.mySelectedRows = $scope.gridApi.selection.getSelectedRows();
                $scope.value = $scope.mySelectedRows[0].MVE_VEID;

                $scope.gridApi.selection.on.rowSelectionChanged($scope, function (row) {
                $scope.value = row.entity.MVE_VEID;
                $scope.contractvalues = contracts.query({ id: $scope.value });
                console.log("scope.contractvalues:", $scope.contractvalues);
                $scope.gridoptions2.data = $scope.contractvalues;
                $scope.gridApi2.core.notifyDataChange(uiGridConstants.dataChange.ALL);
            });
        });
    };

    $scope.contractvalues = contracts.query({ id: $scope.value });
    $scope.gridoptions2 = {
        enableRowHeaderSelection: false,
        multiSelect: false,
        enableRowSelection: true,
        enableSelectAll: true,
        enableSorting: true,
        enableFiltering: true,
        enablePagination: true,
        enablePaginationControls: true,
        paginationCurrentPage: 1,
        paginationPageSize: 100,
        maxVisibleColumnCount: 200,
        columnDefs: [
          { name: 'CONTRACTID', field: 'MCO_COID' },
          { name: 'NAME', field: 'CO_DESC' },
          { name: 'VENDORID', field: 'MCO_VEID' }
        ],
        data: $scope.contractvalues,
        onRegisterApi: function (gridApi) {
            $scope.gridApi2 = gridApi;
        }

    };
    $scope.gridoptions2.onRegisterApi = function (gridApi) {
        $scope.gridApi2 = gridApi;
        console.info("***grid api 2 registered***", $scope.gridApi2);

    };

}
})();