由于添加了cordova-sqlite-storage插件并将控制器重构为如下所示,我看到标签之间的转换时会出现奇怪的行为。
angular.module('blah.controllers').controller('EquipmentCtrl', ['$scope', '$state', 'EquipmentService', 'UtilService', function($scope, $state, EquipmentService, UtilService) {
document.addEventListener("deviceready", getRowsFromDb, false);
function getRowsFromDb() {
EquipmentService.getAllEquipment().then(function(rows) {
$scope.equipmentList = rows;
$scope.equipmentRows = UtilService.chunkArray($scope.equipmentList, 3);
});
}
}]);
在初始页面加载时一切正常/看起来很棒但是当我在标签之间转换时,我没有在页面上看到sqlite的数据,直到我再次点击相同的标签。
页面将加载到显示静态数据(标题,其他文本等),但在第二次点击当前选项卡之前,我将看不到从sqlite返回的数据。我想知道'deviceready'是否在页面加载后触发,但我不确定如何对抗它。
我尝试this solution,但没有看到行为上的任何差异。
是否有其他人遇到过这种情况?若然,最佳攻击方案是什么?
答案 0 :(得分:1)
由于deviceready
在angularjs'上下文之外运行,您必须手动应用消化。在这种情况下,您可以使用$scope.$apply
来应用应用回调中的范围更改:
$scope.$apply(function () {
// do scope things here
});
以下示例取自您的示例并使用此技术进行更新。
angular.module('blah.controllers', [])
.controller('EquipmentCtrl', [
'$scope',
'$state',
'EquipmentService',
'UtilService',
EquipmentCtrl
]);
function EquipmentCtrl($scope, $state, EquipmentService, UtilService) {
document.addEventListener("deviceready", getRowsFromDb, false);
function getRowsFromDb() {
EquipmentService.getAllEquipment().then(function(rows) {
$scope.$apply(function() {
$scope.equipmentList = rows;
$scope.equipmentRows = UtilService.chunkArray($scope.equipmentList, 3);
});
});
}
}