Javascript 服务中未定义的变量,保存值后(AngularJS)
我正在用Cordova编写一个电话目录应用程序,因此使用AngularJs作为逻辑。 我正在使用此服务连接到服务器(它是一个扩散推送服务器)并发送/接收带有数据的消息Javascript 服务中未定义的变量,保存值后(AngularJS),javascript,angularjs,cordova,Javascript,Angularjs,Cordova,我正在用Cordova编写一个电话目录应用程序,因此使用AngularJs作为逻辑。 我正在使用此服务连接到服务器(它是一个扩散推送服务器)并发送/接收带有数据的消息 angular.module('directory.services', []) .service('EmployeeService', function() { var clientSession; var employees = []; this.initConnection = function(
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()时,两个employees变量在作用域和服务中都未定义
我知道链接可能有错误,但服务不应该至少还有数据吗
我尝试使用带有嵌套数组的对象进行链接,并尝试在控制器中使用watch。两者都不起作用
有什么想法吗?我认为您需要将员工作为数组的特定索引
stream.on('message', function(message, id) {
//Called when a message is recieved
employees[id] = JSON.parse(message.content);
console.log(employees);
});
如果你有大量的员工,你一次增加一名。但也许我误解了您的代码。我看到的第一件事是
var employees=[]代码>未绑定到任何内容。那么,您希望如何通过EmployeeService.employees
访问它呢
第二件事是您的服务不会返回任何内容。如果查看,您可以看到注入控制器的服务获取从服务返回的值
这通常是您构建服务的方式:
angular.module('app', []).service('helloService', function() {
var Service = function() { /* INIT CODE HERE */ };
Service.prototype.sayHello = function() {
console.log('hello, world;')
};
return new Service();
})
你也可以返回一个对象文字,一个字符串,一个函数,几乎任何东西,但关键是你要返回一些东西。您只需将它绑定到此
第三件事是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.employees
在每个摘要周期保持最新。$scope.employees
未定义,因为EmployeeService.employees
未定义
在EmployeeService
中,您应该声明如下this.employees=[]
以便您可以全局访问它
现在,对于clearResult
函数中的undefined
情况,向变量this.employees
添加一些伪值,并尝试访问它clearResult
函数
使用断点进行逐步的代码检查
我希望这对你有帮助。
谢谢请通过jsbin.com复制。@FrankFang:这里的代理正在阻止该站点。但是当我回到家的时候,我会尽量告诉你在哪一点你会得到一个错误,根据我的这一行$scope.employees=EmployeeService.employees代码>不正确,因为EmployeeService
中的employees
变量是私有的。请confirm@MithleshKumar收到消息后,我收到一个js错误“element not found”。在此之前,没有任何错误。当在clearSearch函数的开始处将作用域和服务变量记录到控制台时,我得到的是“未定义”both@Cevera请检查我下面的评论,我正在使用服务器搜索员工列表,我得到的数据是一个JSON,其中包含与搜索词匹配的所有员工。每次用户使用新结果搜索时,我都会覆盖该值。您的JSON数组在浏览器中是什么样子的?您有一个链接,或者它只是本地主机?只在本地主机上有,但它基本上看起来像第一个示例中的响应,因为它也是一个Solr响应。我将JSON复制粘贴到我的控制器中,以测试我的html视图,它成功了。所以JSON本身应该是好的,我肯定JSON是好的,我只是想知道里面有多少数组和对象。在使用structur和var服务={currentResult:null}之后代码>作为我的存储变量,我现在可以从控制器中访问这些值。唯一不起作用的是绑定,因此当myservice.currentResult更改时,$scope.employees
会得到更新。检查我的编辑。我想这对你应该有用。很明显,没有演示我无法进行测试。效果很好。谢谢你的帮助!
$scope.watch(
function() { return service.currentResult() },
function(employees) {
$scope.employees = employees;
}
);