javascript - 在服务方法上使用 $interval 不起作用

标签 javascript angularjs web-applications

我正在构建一个移动网络应用程序,用于检测用户浏览器是否可以访问互联网。

我正在使用 AngularJS 框架来实现这一点。我每 1000 毫秒从 AppData 调用一个服务方法来测试用户与 ajax 请求的连接。

PicController 将结果绑定(bind)到我的 html View 。

我的想法是创建一个服务 AppData,它将存储我的应用程序的一般属性和方法。

这段代码根本行不通,我猜是方法不对,有高手能告诉我该怎么做吗?

错误:

TypeError: Cannot read property 'online' of undefined
    at isOnline (pictureViewer.js:24)

代码:

'use strict';

var picApp = angular.module('pictureViewerApp',[]);

picApp.run(['$interval','AppData', function($interval, AppData){
    $interval(AppData.isOnline,1000);
}]);

picApp.controller("PicController",['$scope', 'AppData', function($scope, AppData){
    $scope.online = AppData.online;
}]);

picApp.factory('AppData', ['$http', function($http) {
    var AppData = {};
    AppData.online = false;
    AppData.isOnline = function() {
        var appData = this;
        $http.get('online.php').
            success(function(data) {
                appData.online = true;
            }).
            error(function() {
                appData.online = false;
            });
        console.log("AppData.online = ", appData.online);
    };
    return AppData;
}]);

编辑: 错误恰好发生在这一行:

console.log("AppData.online = ", appData.online);

编辑 2: 如果我调用我的方法一次它工作正常,问题只会在我使用 $interval 调用它时发生。

谢谢

最佳答案

1) 您的 View 不会更新,因为您的 $scope.online 绑定(bind)到 value,而不是 reference(object/数组/函数)。

2) 不使用 bind 就不能将“AppData.isOnline”作为参数传递(检查浏览器兼容性) https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

检查这个工作示例:

var picApp = angular.module('pictureViewerApp',[]);

picApp.run(function(AppData, $interval) {
  $interval(AppData.isOnline.bind(AppData), 1000);
  /*
  //Is same as
  $interval(function(){
    AppData.isOnline();
  }, 1000);*/
});

picApp.controller("PicController",['$scope', 'AppData', function($scope, AppData){
    $scope.AppData = AppData;
}]);

picApp.factory('AppData', function($q) {
    var AppData = {
      online: false
      
    };
    
    AppData.isOnline = function() {      
      var deferred = $q.defer();
      
      // TODO: Use $http to load.
      this.online = true;
      deferred.resolve(true);
      
      return deferred.promise;
    };
  
    
    return AppData;
});
<!DOCTYPE html>
<html ng-app="pictureViewerApp">

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script data-require="angular.js@1.4.x" src="https://code.angularjs.org/1.4.0-rc.0/angular.js" data-semver="1.4.0-rc.0"></script>
  </head>

  <body ng-controller="PicController">
    <p>User is online? {{AppData.online}}!</p>
  </body>

</html>

关于javascript - 在服务方法上使用 $interval 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29626676/

相关文章:

javascript - 在 react 文件上传中无法正常工作

javascript - 在 jquery ajax 中使用动态数据实现自动完成

javascript - Iframe 的滚动条

javascript - Angular JS - 是否有在同一模块中一起使用服务和工厂的用例

javascript - 想要从 .gs 文件的代码中提醒 html

javascript - 为什么 FB.Canvas.getPageInfo() 的值返回全零

javascript - 如何正确观察元素外的点击?

angularjs - 连接和缩小代码,AngularJS

c# - 页面退出时执行操作

javascript - IndexedDB 在哪里?你如何使用它?