angularjs coffeescript ngtable

AngularJS ng-table no puede establecer la propiedad ''$ data'' de null



coffeescript ngtable (1)

Acabo de empezar a usar ng-table y estoy tratando de probarlo a través de pruebas de unidad de jazmín (no estoy seguro si esta es la mejor manera de probar mis controladores) y sigo corriendo en este error;

TypeError: Cannot set property ''$data'' of null at project/vendor/assets/javascripts/ng-table-0.3.1/ng-table.src.js:396:55 at C (project/vendor/assets/javascripts/angular-min.js:92:375) at project/vendor/assets/javascripts/angular-min.js:94:28 at h.$eval (project/vendor/assets/javascripts/angular-min.js:102:308) at h.$digest (project/vendor/assets/javascripts/angular-min.js:100:50) at h.$apply (project/vendor/assets/javascripts/angular-min.js:103:100) at f (project/vendor/assets/javascripts/angular-min.js:67:98) at handleResponse (project/vendor/assets/javascripts/angular-mocks.js:1160:9) at Function.$httpBackend.flush (project/vendor/assets/javascripts/angular-mocks.js:1491:26) at null.<anonymous> (project/spec/javascripts/unit/debtors_controller_spec.js.js:50:24)

Aquí es donde configuro ngTableParams en mi controlador

# Setup ng-table with defaults and data $scope.tableParams = new ngTableParams({ page: 1, count: 10, sorting: { code: ''asc''} }, { # data is created by ngTableParams total: 0, # ng-table will ask for updated data, this is where it gets it from. getData: ($defer, params) -> # Go get a list of debtors Debtor.query {}, (data) -> # Once successfully returned from the server with my data process it. params.total(data.length) # Filter filteredData = (if params.filter then $filter(''filter'')(data, params.filter()) else data) # Sort orderedData = (if params.sorting then $filter(''orderBy'')(filteredData, params.orderBy()) else data) # Paginate $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count())) })

Aquí está la prueba de jazmín

# ================================================================================ # Delete tests # ================================================================================ describe "destroy", -> beforeEach(inject ( ($controller, $rootScope, $location, $state, $httpBackend) -> ctrl = $controller(''DebtorsController'', { $scope: @scope, $location: $location }) )) it "gets new listing", -> @scope.debtors = [{id: 1, name: "Good guys"}, {id: 2, name: "John"}] @httpBackend.whenDELETE(''/clients/1'').respond(200) @httpBackend.whenGET(''/debtors'').respond(200, [{name: "John"}]) @scope.destroy(1) @httpBackend.flush() expect(@scope.debtors[0].name).toEqual(''John'')

Aquí está mi código para eliminar (que funciona)

# -------------------------------------------------------------------------------- # Delete # -------------------------------------------------------------------------------- $scope.destroy = (id) -> Client.delete id: id , (response) -> # Success flash("notice", "Client deleted", 2000) $scope.tableParams.reload() # Reload ng-table data, which will get a new listing from the server. , (response) -> # Failure


¿Puedes mostrar el código en tu controlador donde inicializas ngTableParams?

El problema es que ng-table usa ngTableController para establecer $scope para ngTableParams . Como usted está realizando pruebas unitarias, no tendrá un ngTableController por lo que $scope de ngTableParams será nulo. Debería establecer manualmente $scope de ngTableParams en su prueba de unidad. Pruebe algo similar a este JS (realmente no me gusta el coffeescript, así que conviértalo a sus necesidades):

beforeEach(inject(function ($controller, $rootScope) { scope = $rootScope.$new(); ctrl = $controller(''DebtorsController'', { $scope: scope, $location: $location }); scope.tableParams.settings().$scope = scope; }));

Suponiendo que tiene algo como lo siguiente en su controlador donde inicializa sus ngTableParams :

$scope.tableParams = new ngTableParams({ page: 1, // show first page count: 10 // count per page }, { total: data.length, // length of data getData: function($defer, params) { $defer.resolve(data.slice((params.page() - 1) * params.count(), params.page() * params.count())); } });