ngTable 不会重新加载数据
ngTable Will Not Reload Data
我是一位经验丰富的 C# 和 MVC 程序员,但才刚开始 AngularJS。我一直在使用 ngTable(无论如何都在尝试),但收效甚微,但有一个问题我无法解决——无论我做什么,当数据发生变化时,我无法获得特定的 table 来刷新。
我正在通过工厂从 Web API 获取数据 - 它是与特定产品关联的供应商列表。第一次加载屏幕时,数据被带回并且 table 显示正常 - 任何后续调用,数据被返回,但 table 没有更新。页面的其他区域正在按预期更新。
我已经完成了一些控制台日志记录,可以看到数据正在返回。我尝试了 tableParams.reload()
功能,并设置了 tableParams.total()
但似乎没有任何东西可以触发 table 刷新。
这是我在控制器中的功能:
function getStockSupplier() {
console.log("getStockSupplier()");
$scope.stockSupplierTableParams = {};
stockSupplier.getAll({ url: "localhost:52457", sku: $scope.model.sku })
.$promise.then(function (response) {
$scope.stockSupplier = response;
$scope.stockSupplierTableParams = new NgTableParams({
}, {
dataset: response
});
console.log("Got result");
console.log("Length: " + $scope.stockSupplierTableParams.settings().dataset.length);
$scope.stockSupplierTableParams.reload();
}, function (response) {
alert('no stock item');
$scope.stockSupplier = null;
});
}
这是我的 HTML 代码:
<div ng-controller="stockController">
<div>
<table ng-table="stockSupplierTableParams" class="table table-condensed table-bordered table-striped">
<tr ng-repeat="issue in $data">
<td data-title="'Supplier1'">
{{issue.SupplierName}}
</td>
<td data-title="'On Order'">
{{issue.OnOrder}}
</td>
</tr>
</table>
</div>
</div>
我完全不知所措 - 这可能是我缺少的一些基本知识,但它让我发疯,所以非常感谢任何帮助。
编辑:这是 Web API 服务调用的代码,以防有任何相关性。另外,我应该指出上面的 HTML 是在指令中使用的,如果这有什么不同的话。
var myService = angular.module('myService', ['ngResource']);
myService.factory('stockSupplier', [
'$resource',
function ($resource) {
return $resource('http://:url/api/StockInfo?Sku=:sku&StockSupplier=true',
{
url: '@url',
sku: '@sku'
},
{
getAll: {
method: 'GET',
isArray: true
},
});
}
]);
我有一个简单的解决方案,你可以在加载数据时重新渲染table:
HTML
<div ng-controller="stockController">
<div data-ng-if="tableIsReady">
<table ng-table="stockSupplierTableParams" class="table table-condensed table-bordered table-striped">
<tr ng-repeat="issue in $data">
<td data-title="'Supplier1'">
{{issue.SupplierName}}
</td>
<td data-title="'On Order'">
{{issue.OnOrder}}
</td>
</tr>
</table>
</div>
<div data-ng-if="!tableIsReady">
// you can put loader here
</div>
</div>
JS
function getStockSupplier() {
console.log("getStockSupplier()");
$scope.stockSupplierTableParams = {};
$scope.tableIsReady = false; // here we hide table, and show loader
stockSupplier.getAll({ url: "localhost:52457", sku: $scope.model.sku })
.$promise.then(function (response) {
$scope.stockSupplier = response;
$scope.stockSupplierTableParams = new NgTableParams({
}, {
dataset: response
});
console.log("Got result");
console.log("Length: " + $scope.stockSupplierTableParams.settings().dataset.length);
$scope.stockSupplierTableParams.reload();
$scope.tableIsReady = true; // here we show table again
$scope.$apply() // start digest
}, function (response) {
alert('no stock item');
$scope.stockSupplier = null;
});
}
否则,你的代码没问题,你可能会忘记在 $scope.stockSupplierTableParams.reload();
之后加上 $scope.$apply()
我成功了!虽然我不是 100% 确定如何,所以如果有经验的 Angular 开发人员可以解释它,我将不胜感激。它有两个部分。
基本上 - 我没有将数据集设置为 API 调用的响应对象,而是将其设置为变量 $scope.stockSuppler
。然后,我在更新前明确清空这个变量——代码如下:
function getStockSupplier() {
console.log("getStockSupplier()");
$scope.tableIsReady = false;
$scope.stockSupplierTableParams = {};
$scope.stockSupplier = [];
stockSupplier.getAll({ url: "localhost:52457", sku: $scope.model.sku })
.$promise.then(function (response) {
$scope.stockSupplier = response;
$scope.stockSupplierTableParams = new NgTableParams({
}, {
dataset: $scope.stockSupplier
});
console.log("Got result");
console.log("Length: " + $scope.stockSupplierTableParams.settings().dataset.length);
$scope.stockSupplierTableParams.reload();
$scope.tableIsReady = true;
}, function (response) {
alert('no stock item');
$scope.stockSupplier = null;
});
}
此外,我从指令 HTML 代码中删除了 ngController="stockController"
- 该指令在已经定义了控制器的 div 中调用。两次定义控制器似乎也使它感到困惑。我要强调的是,只有进行这两项更改,我才能开始工作。一个或另一个,它仍然无法正常工作。
table 现在正在按预期更新页面上的其他部分。
我不确定为什么使用范围变量而不是 API 的响应会有所不同,但它已经成功了。
我是一位经验丰富的 C# 和 MVC 程序员,但才刚开始 AngularJS。我一直在使用 ngTable(无论如何都在尝试),但收效甚微,但有一个问题我无法解决——无论我做什么,当数据发生变化时,我无法获得特定的 table 来刷新。
我正在通过工厂从 Web API 获取数据 - 它是与特定产品关联的供应商列表。第一次加载屏幕时,数据被带回并且 table 显示正常 - 任何后续调用,数据被返回,但 table 没有更新。页面的其他区域正在按预期更新。
我已经完成了一些控制台日志记录,可以看到数据正在返回。我尝试了 tableParams.reload()
功能,并设置了 tableParams.total()
但似乎没有任何东西可以触发 table 刷新。
这是我在控制器中的功能:
function getStockSupplier() {
console.log("getStockSupplier()");
$scope.stockSupplierTableParams = {};
stockSupplier.getAll({ url: "localhost:52457", sku: $scope.model.sku })
.$promise.then(function (response) {
$scope.stockSupplier = response;
$scope.stockSupplierTableParams = new NgTableParams({
}, {
dataset: response
});
console.log("Got result");
console.log("Length: " + $scope.stockSupplierTableParams.settings().dataset.length);
$scope.stockSupplierTableParams.reload();
}, function (response) {
alert('no stock item');
$scope.stockSupplier = null;
});
}
这是我的 HTML 代码:
<div ng-controller="stockController">
<div>
<table ng-table="stockSupplierTableParams" class="table table-condensed table-bordered table-striped">
<tr ng-repeat="issue in $data">
<td data-title="'Supplier1'">
{{issue.SupplierName}}
</td>
<td data-title="'On Order'">
{{issue.OnOrder}}
</td>
</tr>
</table>
</div>
</div>
我完全不知所措 - 这可能是我缺少的一些基本知识,但它让我发疯,所以非常感谢任何帮助。
编辑:这是 Web API 服务调用的代码,以防有任何相关性。另外,我应该指出上面的 HTML 是在指令中使用的,如果这有什么不同的话。
var myService = angular.module('myService', ['ngResource']);
myService.factory('stockSupplier', [
'$resource',
function ($resource) {
return $resource('http://:url/api/StockInfo?Sku=:sku&StockSupplier=true',
{
url: '@url',
sku: '@sku'
},
{
getAll: {
method: 'GET',
isArray: true
},
});
}
]);
我有一个简单的解决方案,你可以在加载数据时重新渲染table:
HTML
<div ng-controller="stockController">
<div data-ng-if="tableIsReady">
<table ng-table="stockSupplierTableParams" class="table table-condensed table-bordered table-striped">
<tr ng-repeat="issue in $data">
<td data-title="'Supplier1'">
{{issue.SupplierName}}
</td>
<td data-title="'On Order'">
{{issue.OnOrder}}
</td>
</tr>
</table>
</div>
<div data-ng-if="!tableIsReady">
// you can put loader here
</div>
</div>
JS
function getStockSupplier() {
console.log("getStockSupplier()");
$scope.stockSupplierTableParams = {};
$scope.tableIsReady = false; // here we hide table, and show loader
stockSupplier.getAll({ url: "localhost:52457", sku: $scope.model.sku })
.$promise.then(function (response) {
$scope.stockSupplier = response;
$scope.stockSupplierTableParams = new NgTableParams({
}, {
dataset: response
});
console.log("Got result");
console.log("Length: " + $scope.stockSupplierTableParams.settings().dataset.length);
$scope.stockSupplierTableParams.reload();
$scope.tableIsReady = true; // here we show table again
$scope.$apply() // start digest
}, function (response) {
alert('no stock item');
$scope.stockSupplier = null;
});
}
否则,你的代码没问题,你可能会忘记在 $scope.stockSupplierTableParams.reload();
$scope.$apply()
我成功了!虽然我不是 100% 确定如何,所以如果有经验的 Angular 开发人员可以解释它,我将不胜感激。它有两个部分。
基本上 - 我没有将数据集设置为 API 调用的响应对象,而是将其设置为变量 $scope.stockSuppler
。然后,我在更新前明确清空这个变量——代码如下:
function getStockSupplier() {
console.log("getStockSupplier()");
$scope.tableIsReady = false;
$scope.stockSupplierTableParams = {};
$scope.stockSupplier = [];
stockSupplier.getAll({ url: "localhost:52457", sku: $scope.model.sku })
.$promise.then(function (response) {
$scope.stockSupplier = response;
$scope.stockSupplierTableParams = new NgTableParams({
}, {
dataset: $scope.stockSupplier
});
console.log("Got result");
console.log("Length: " + $scope.stockSupplierTableParams.settings().dataset.length);
$scope.stockSupplierTableParams.reload();
$scope.tableIsReady = true;
}, function (response) {
alert('no stock item');
$scope.stockSupplier = null;
});
}
此外,我从指令 HTML 代码中删除了 ngController="stockController"
- 该指令在已经定义了控制器的 div 中调用。两次定义控制器似乎也使它感到困惑。我要强调的是,只有进行这两项更改,我才能开始工作。一个或另一个,它仍然无法正常工作。
table 现在正在按预期更新页面上的其他部分。
我不确定为什么使用范围变量而不是 API 的响应会有所不同,但它已经成功了。