Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 服务中未定义的变量,保存值后(AngularJS)_Javascript_Angularjs_Cordova - Fatal编程技术网

Javascript 服务中未定义的变量,保存值后(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(

我正在用Cordova编写一个电话目录应用程序,因此使用AngularJs作为逻辑。 我正在使用此服务连接到服务器(它是一个扩散推送服务器)并发送/接收带有数据的消息

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}之后作为我的存储变量,我现在可以从控制器中访问这些值。唯一不起作用的是绑定,因此当my
service.currentResult更改时,
$scope.employees
会得到更新。检查我的编辑。我想这对你应该有用。很明显,没有演示我无法进行测试。效果很好。谢谢你的帮助!
$scope.watch(
  function() { return service.currentResult() },
  function(employees) {
    $scope.employees = employees;
  }
);