私は角度とSQLiteの通信をテストしています。ユーザーがページにアクセスすると、選択した会社のIDとNAMEをデータベースから取得する必要があります。私はイオンオートコンプリートを使用して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;
};
})();
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)"/>
私はデ・ファクトリーとサービス内で使用している場合は、コントローラ内部でド「の$ q.defer」を使用する必要がある理由分かりましたしません。私が使用しないと、コントローラは値をイオン完全に戻すことはできません。何か不足していますか?またはコードは正しいですか?
このメソッドを自動完了にバインドしている可能性があります。私はあなたがそのコードを共有していないと仮定しています。 $ q.deferを使用する代わりに、単にCompanyService.getId(modalValue)を返すことができます。 VM.modelToItemMethod – Developer
質問にオートコンプリートスニペットを追加しました。私はコード内の$ q.deferを使って会社をオートコンプリートに戻すことができます。メソッドを削除すると、メソッドが3回実行され、オートコンプリートは更新されません。 – phew
'CompanyService.getId(modalValue)を返します。 'あなたの方法で – Developer