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()));
}
});