为什么我的服务先于其他服务运行?

时间:2017-07-09 14:52:59

标签: angularjs angular-ui-grid angular-services ui-grid

我是服务,工厂等的新手;所以还有很多我不明白的事情。

我有一个ui-grid。选择行时,我想将该数据用作服务中的参数,以获取REST数据以填充另一个网格。

这是我认为它应该做的事情:

  

gridOne已注册=>行选择=>将selectedRow.id发送到Service =>服务GETs data =>数据填充网格2

这就是它实际做的事情:

  

服务GETs data =>错误,因为未定义selectedRow.id

01| $scope.gridOne.onRegisterApi = function(gridApi){
02|     $scope.gridOneApi = gridApi
03|     $scope.gridOneApi.selection.on.rowSelectionChanged(null, function(row){
04|         $scope.gridOneSelectedRow = $scope.gridOneApi.selection.getSelectedRows()[0]
05|
06|         // v---Breakpoint on this line triggered before any grid is built---v
07|         myService.getAllObjects($scope.gridOneSelectedRow.id).then(response => {
08|             $scope.grid2.data = response
09|         }
10|     })
11| }

我的服务如下:

app.service('myService', function ($http) {

    return {
        get: getObjects
    }

    function getOjects(id) {
        let url = `http://${domain}/object/${id}`
        return $http.get(url).then(response => {
            return response
        }).catch(error => {
            return error
        })
    }
}

为什么服务功能在其他所有事情之前运行?

1 个答案:

答案 0 :(得分:0)

如果您正在编写服务,则不应返回对象/函数/某些内容,您的实现函数将用作新建的构造函数并创建服务实例。

因此,如果您要使用服务,myService的示例将为

app.service('myService', function ($http) {
    function getOjects(id) {
        //you should properly replace your domain, may be with the same domain by default if you start from object/...
        let url = `http://${domain}/object/+ id`
        return $http.get(url).then(response => {
            return response.data
        }).catch(error => {
            return error
        })
    }
    this.getAllObjects = getOjects;
})

如果是工厂

app.factory('myService', function ($http) {
    function getOjects(id) {
        //you should properly replace your domain, may be with the same domain by default if you start from object/...
        let url = `http://${domain}/object/+ id`
        return $http.get(url).then(response => {
            return response.data
        }).catch(error => {
            return error
        })
    }
    return {getAllObjects: getOjects};
})

并且在注入结束时,您不需要像使用它来加载数据一样更改代码,只需编写代码同步使用 而且,我知道,为什么你要在加载数据之前尝试选择,并且在行选择的处理程序内你想要在现在存在行的时候调用数据,如果没有加载数据,对吧?我希望您在选择grid2行时加载另一个网格grid1的数据,然后想要将与该行相关的相应数据加载到grid2

无论你有什么疑问,请随意发表评论。

祝你好运:)