Ich teste die Kommunikation von eckigen und SQLite. Ich muss die ID und den NAMEN der ausgewählten Firma von der Datenbank erhalten, wenn der Benutzer auf die Seite zugreift. Ich verwende die ion-autcomplete, um das Unternehmen auf der CRUD-Seite auszuwählen.Wie Sync Controller mit Service
Service: 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;
};
}
})();
Factory: 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));
}
};
}
})();
Controller: 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;
};
})();
Company.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)"/>
ich undestand nicht, warum ich de „$ q.defer“ in der Steuerung verwenden müssen, wenn ich innerhalb von Fabrik und Service bin mit. Wenn ich nicht verwende, kann der Controller den Wert nicht an ion-aucomplete zurücksenden. Fehle ich etwas? Oder der Code ist richtig?
Möglicherweise binden Sie diese Methode an die automatische Vervollständigung. Ich gehe davon aus, dass Sie diesen Code nicht geteilt haben. Anstatt $ q.defer zu verwenden, können Sie einfach CompanyService.getId (modalValue) zurückgeben; In Ihrer VM.modelToItemMethod – Developer
habe ich das Autocomplete-Snippet zur Frage hinzugefügt. Ich kann die Firma nur an die Autovervollständigung zurückgeben, indem ich $ q.defer im Code verwende. Wenn ich die Methode entferne, wird sie dreimal ausgeführt und die Autocomplete wird nicht aktualisiert. – phew
Versuchen Sie einfach 'zurück CompanyService.getId (modalValue); 'in Ihrer Methode – Developer