我正在使用Cordova编写电话目录应用,因此使用AngularJs进行逻辑处理。
我正在使用此服务连接到服务器(它是Diffusion Push服务器),并使用数据发送/接收消息。

angular.module('directory.services', [])

.service('EmployeeService', function() {
    var clientSession;
    var employees = [];

    this.initConnection = function() {
        diffusion.connect({
            host : 'localhost',
            port : 8080,
            secure : false,
            principal : 'admin',
            credentials : 'password'
         }).then(function(session) {
             clientSession = session;
            session.on({
                [...] // Lots of session listerners
            });
           var subscription = session.subscribe('Company/Test');
           var stream = session.messages.listen('Company/Test');

           stream.on('message', function(message) {
               //Called when a message is recieved
                employees = JSON.parse(message.content);
                console.log(employees);
               // log shows me the data fine here
           });
        });
    }

    this.sendMessage = function(content){
        clientSession.messages.send('Company/Test', content);
    }

    this.clearResult = function(){
        employees= [];
    }
});


控制器:

angular.module('directory.controllers', [])

.controller('empListCtrl', function ($scope, $ionicPlatform, EmployeeService) {
    $scope.employees = EmployeeService.employees;
    $scope.searchKey = "";

    $scope.clearSearch = function () {
        // console.log() gives "undefined" for both variables here
        $scope.searchKey = "";
        EmployeeService.clearResult();
    }

    $scope.search = function () {
        EmployeeService.sendMessage($scope.searchKey);
    }

    EmployeeService.initConnection();
});


问题:
我从服务器流中获取值,并将其保存在我的服务变量中。
但是,当我从控制器调用clearSearch()时,在范围和服务中,这两个雇员变量均未定义。

我知道链接可能有错误,但是至少不应该该服务仍然有数据吗?

我尝试使用带有嵌套数组的对象进行链接,并尝试在控制器中使用监视。两者都没有工作。

有任何想法吗?

最佳答案

我首先看到的是var employees = [];没有绑定任何东西。那么,您如何期望通过EmployeeService.employees访问它呢?

第二件事是您的服务不返回任何东西。如果查看documentation,您会看到注入到控制器的服务将采用从服务返回的值。

通常,这是构建服务的方式:

angular.module('app', []).service('helloService', function() {
  var Service = function() { /* INIT CODE HERE */ };

  Service.prototype.sayHello = function() {
    console.log('hello, world;')
  };

  return new Service();
})


您还可以返回对象文字,字符串,函数,几乎所有内容,但要点是您要返回某些内容。您只是将方法绑定到this

第三件事是EmployeeService.initConnection()是异步调用,不能保证在您调用sendMessage()时已初始化连接。可以,但是您需要在触发任何一种服务方法之前确保连接已准备就绪。您可以通过阻止交互操作直到达成承诺来做到这一点。

// controller template scope
<button ng-click="sendMessage()" ng-disabled="connecting">Send Message</button>

// controller
$scope.connecting = true;
EmployeeService.initConnection().then(function() {
   $scope.connecting = false;
});

// service
.service('EmployeeService', ['$q', function() {
  var clientSession;
  var employees = [];
  var service = {}

  service.initConnection = function() {
    var defer = $q.defer();

    // do this in connection success callback
    defer.resolve();

    // do this if the connection fails
    dewfer.reject();

    return defer.promise;
  }

  return service;
}]);


这是我可以提供的所有建议,直到您更具体为止。



编辑:您可以像这样监视您的服务的更新:

$scope.watch(
  function() { return service.currentResult() },
  function(employees) {
    $scope.employees = employees;
  }
);


这将始终使$scope.employees保持最新的每个摘要周期。

09-25 21:19