我正在使用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
保持最新的每个摘要周期。