2016-08-28 1 views
0

私は角度と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」を使用する必要がある理由分かりましたしません。私が使用しないと、コントローラは値をイオン完全に戻すことはできません。何か不足していますか?またはコードは正しいですか?

+0

このメソッドを自動完了にバインドしている可能性があります。私はあなたがそのコードを共有していないと仮定しています。 $ q.deferを使用する代わりに、単にCompanyService.getId(modalValue)を返すことができます。 VM.modelToItemMethod – Developer

+0

質問にオートコンプリートスニペットを追加しました。私はコード内の$ q.deferを使って会社をオートコンプリートに戻すことができます。メソッドを削除すると、メソッドが3回実行され、オートコンプリートは更新されません。 – phew

+0

'CompanyService.getId(modalValue)を返します。 'あなたの方法で – Developer

答えて

2

このメソッドは自動的にバインドされます。 ajax呼び出しが非同期であるため、プリミアムを返す必要があります。それが$ q.deferを使い終わった理由です。

$ qを使用したくない場合は、$ q.deferを使用する代わりに、VM.modelToItemMethodでreturn CompanyService.getId(modalValue);を実行して、inturnが遅延オブジェクトを返すことができます。

関連する問題