【发布时间】:2017-01-04 08:40:50
【问题描述】:
我正在测试 Angular 和 SQLite 的通信。当用户访问页面时,我需要从数据库中获取所选公司的 ID 和 NAME。我正在使用 ion-autcomplete 在 CRUD 页面中选择公司。
服务:sqlite.js
(function () {
'use strict';
angular
.module('Test')
.service('$sqliteService', $sqliteService);
$sqliteService.$inject = ['$q', '$cordovaSQLite'];
function $sqliteService($q, $cordovaSQLite) {
var self = this;
var _db;
self.db = function () {
if (!_db) {
if (window.sqlitePlugin !== undefined) {
_db = window.sqlitePlugin.openDatabase({ name: "my.db", location: 2, createFromLocation: 1 });
} else {
// For debugging in the browser
_db = window.openDatabase("my.db", "1", "Database", 200000);
}
}
return _db;
};
self.getFirstItem = function (query, parameters) {
var deferred = $q.defer();
self.executeSql(query, parameters).then(function (res) {
if (res.rows.length > 0)
return deferred.resolve(res.rows.item(0));
else
return deferred.reject("There aren't items matching");
}, function (err) {
return deferred.reject(err);
});
return deferred.promise;
};
}
})();
工厂:CompanyService.js
(function () {
'use strict';
angular
.module('Test')
.factory('CompanyService', CompanyService);
CompanyService.$inject = ['$q', '$sqliteService'];
function CompanyService($q, $sqliteService) {
return {
getId: function (Id) {
var query = "Select * FROM Company WHERE ID = ?";
var values = [Id];
return $q.when($sqliteService.getFirstItem(query, values));
}
};
}
})();
控制器:CompanyController.js
(function() {
'use strict';
angular
.module('Test')
.controller('CompanyEditController', CompanyEditController);
CompanyEditController.$inject = ['$scope', '$q', '$stateParams', '$state', '$cordovaCamera', '$cordovaImagePicker', '$ionicPopup', 'CompanyService'];
function OcorrenciaEditController($scope, $q, $stateParams , $state, $cordovaCamera, $cordovaImagePicker, $ionicPopup, CompanyService) {
var vm = $scope;
vm.modelToItemMethod = function (modelValue) {
var d = $q.defer();
CompanyService.getId(modelValue)
.then(function(data) {
console.log('My first promise succeeded', JSON.stringify(data));
$q.resolve(data);
}, function(error) {
console.log('My first promise failed', error.message);
});
return d.promise;
};
})();
公司.html
<input ion-autocomplete ng-model="company.IdCompany" type="text" name="fieldEmpresa" placeholder="Empresa" readonly="readonly" class="ion-autocomplete" autocomplete="off" max-selected-items="1" required
item-value-key="Id"
item-view-value-key="CompanyName"
items-method="getTestItems(query)"
cancel-label="Cancel"
items-removed-method="itemsRemoved()"
loader-icon="spinner"
external-model="company"
model-to-item-method="modelToItemMethod(modelValue)"/>
如果我在 de Factory 和 Service 中使用,我不明白为什么我需要在控制器中使用 de "$q.defer"。如果我不使用,控制器无法将值返回给 ion-aucomplete。我错过了什么吗?还是代码是对的?
【问题讨论】:
-
您可能将此方法绑定到自动完成。我假设您没有共享该代码。而不是使用 $q.defer ,你可以做 return CompanyService.getId(modalValue);在你的 VM.modelToItemMethod
-
我在问题中添加了自动完成 sn-p。我只能使用代码中的 $q.defer 将公司返回到自动完成。如果我删除该方法执行三遍,它不会更新自动完成。
-
在你的方法中尝试
return CompanyService.getId(modalValue); -
就是这样。我浪费了一些时间寻找,而且答案很简单。谢谢!!!
标签: angularjs sqlite ionic-framework android-sqlite