Вызов остальных строк UI-grid в Angularjs

Я попытался сделать вызов отдыха с помощью $http с помощью функции поля die ui-grid(v3.0.0-rc.20-8199eb5). См. пример ниже.

$scope.gridOptions = {
        enableSorting: true,
        columnDefs: [
          { name:'name', field: 'name' },
          { name:'getDepartment', field: 'getDepartment()', enableCellEdit:false}
        ],
        data : [      {
                           "name": "Rex",
                           "getDepartment" : function() {return deparmentService.findByName(this.name);}
                       }
                   ]
      };

}]);

Браузер входит в бесконечный цикл. Вызов DepartmentService $http зависит от переданного ему параметра имени start.

Как я могу сделать вызов $http ajax из сетки пользовательского интерфейса, когда он загружает строки?


person Rentius2407    schedule 16.04.2015    source источник


Ответы (2)


Почему бы вам не получить данные, а затем заполнить все отделы, а затем отдать их в сетку?

Или получить данные, передать их в сетку и в фоновом режиме запустить итератор, который получит все отделы и заполнит их данными.

Вы действительно не хотите, чтобы сетка вызывала службу http каждый раз, когда она отображает строку — она повторно отображает строки каждый раз, когда кто-то прокручивает. (не совсем, но на многих событиях и некоторых свитках)

Таким образом, вы получите:

$scope.getDepartment = function(name) {
  return departmentService.findByName(name);
};

$scope.data = [
  name: 'Rex'
];

$scope.gridOptions = {
  enableSorting: true,
  columnDefs: [
    { name:'name', field: 'name' },
    { name:'getDepartment', field: 'getDepartment()', enableCellEdit:false}
  ],
  data: 'data'
};

// I'm imagining here that getDepartment is expensive
// so you may want to do this in batches or something
// but this illustrates that it's out of band - after the grid renders
$timeout( function() {
  $scope.data.forEach(function(row) {
    row.getDepartment = $scope.getDepartment(row.name);
  });
}, 100);
person PaulL    schedule 16.04.2015
comment
Привет PaulL спасибо за объяснение. Только одно: при выполнении вызова функции $timeout это та итерация, о которой вы упомянули, и будет ли она запускаться автоматически, когда достигнет строки $timeout, или я должен ее откуда-то вызывать? - person Rentius2407; 16.04.2015
comment
Да, внутри $timeout есть итерация (forEach). Он запустится автоматически через 100 мс после инициализации контроллера. Вы можете отрегулировать это вверх или вниз. Основная проблема заключается в том, что если у вас есть сотни строк, и если вызов медленный, это потенциально может немного заблокировать ваш браузер во время его работы, в зависимости от нескольких вещей. Поэтому, если у вас много строк, вы можете начать с первых 20, подождать 1 с, затем добавить еще 20 и т. д. Было бы лучше изменить свой сервер, чтобы получить все эти данные за один раз, но я м предполагая, что вы не можете сделать это. - person PaulL; 16.04.2015

Попробуйте использовать сервис в отдельном файле. Это поможет вам организовать код.

app.factory('yService', ['$http', 'sessionService', function ($http, sessionService) {
    return {
        GetNames: function () {
            return $http({
                method: "get",
                url: "/api/Common/GetNames"
             });
        }
    }
}]);

С вашего контроллера вызовите, как показано ниже,

    yService.GetNames().success(function (data) {
                // copy your data to one object
//$scope.departments
            }).
                error(function (data) {

                });

В ng-init вызовите указанный выше yservice.GetNames и сделайте следующее:

$scope.departments={};
    $scope.gridOptions = {
            enableSorting: true,
            columnDefs: [
              { name:'name', field: 'name' },
              { name:'getDepartment', field: 'getDepartment()', enableCellEdit:false}
            ],
            data : [      {
                               "name": "Rex",
                               "getDepartment" : $scope.departments;}
                           }
                       ]
          };

    }]);
person suresh G    schedule 16.04.2015
comment
не думаю, что вы понимаете мой вопрос. Я обновил пример, пожалуйста, смотрите выше. Я звоню в службу DepartmentService с текущим именем «Рекс». Когда ui-grid загружается, ему необходимо сделать отдельный вызов для каждого имени строки в DepartmentService. Поэтому мне не нужны имена, потому что они уже предварительно загружены как данные ui-grid. - person Rentius2407; 16.04.2015