2016-08-28 3 views
0

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?

+0

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

+0

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

+0

Versuchen Sie einfach 'zurück CompanyService.getId (modalValue); 'in Ihrer Methode – Developer

Antwort

2

Sie binden diese Methode an die automatische Vervollständigung. Da ein Ajax-Aufruf asynchron ist, musst du ein Primise zurückgeben. Das ist der Grund, warum du $ q.defer benutzt hast.

Wenn Sie nicht $ q verwenden möchten, können Sie anstelle von $ q.defer in Ihrem VM.modelToItemMethod einfach return CompanyService.getId(modalValue); eingeben, wodurch ein verzögertes Objekt zurückgegeben wird.