Angularjs ui-grid извикване на почивка на ред

Опитах се да направя повикване за почивка с $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 зависи от началния параметър за име, който му се предава.

Как мога да направя $http ajax извикване от ui-мрежата, когато зарежда редове?


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). Той ще стартира автоматично 100ms след стартиране на контролера. Можете да регулирате това нагоре или надолу. Основният проблем е, ако имате стотици редове и ако извикването е бавно, това потенциално ще блокира малко браузъра ви, докато работи, в зависимост от няколко неща. Така че, ако имате много редове, може да искате да стартирате първите 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
не мисля, че разбираш въпроса ми. Актуализирах примера, моля вижте по-горе. Обаждам се на отдела Service с текущо име, което е „Rex“. Когато ui-мрежата се зареди, тя трябва да направи отделно извикване за всяко име на ред към departmentService. Така че нямам нужда от имената, защото те вече са предварително заредени като данни за ui-grid. - person Rentius2407; 16.04.2015