【问题标题】:How to sync controller with Service如何将控制器与服务同步
【发布时间】: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


【解决方案1】:

您正在将此方法绑定到自动完成;由于 ajax 调用是异步的,你必须返回一个 primise。这就是你最终使用 $q.defer 的原因。

如果您不想使用 $q,那么您可以在 VM.modelToItemMethod 中执行 return CompanyService.getId(modalValue); 而不是使用 $q.defer,这反过来会返回一个延迟对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2012-09-25
    • 2019-01-16
    • 2012-10-11
    相关资源
    最近更新 更多