【问题标题】:Why after adding $interval other call to funtions stop working?为什么在添加 $interval 后对函数的其他调用停止工作?
【发布时间】:2017-09-28 15:29:01
【问题描述】:

我正在开发由其他人开发的应用程序,我没有任何文档或任何联系方式,我遇到了这个问题:

这是一个角度应用程序,需要每分钟刷新一次,在应用程序的其他部分,他们使用 $interval,但在此页面中,如果我尝试使用它,对我的 WebAPI 的调用将停止工作,我收到了错误:

WebApiFactory.getNoStatusOrders is not a function

我需要你的帮助才能知道为什么会这样,这是我的代码:

angular.module('AssemblyLive').controller('overviewCarsWithoutStatus', [
'$scope', '$rootScope', '$location', 'WebApiFactory', "$interval", 'StatusPointMonitorFactory',
function ($scope, $rootScope, $location, $interval, WebApiFactory, StatusPointMonitorFactory) {
    ...
    var areas = {
        bodyShop1:"B000,B001,B020,B031,B200,B211,B220,B231,B300,B311,B320,B331,B370,B371,B375,B376,B380,B381,B383,B386,B390,B400,B401,B410,B420,B421,B425,B426,B430",
        bodyShop2: "B431,B435,B436,B440,B451,B500,B521,B540,B551,B553,B600,B750,B760,B770,B781,B783,B790,B791,B800,B811,B813,B900",
        paintShop1: "D000,D011,D012,D051,D100,D130,D131,D132,D151,D152,D230,D251,D252,D300,D351,D352,D360,D381,D390,D400,D451,D452,D470",
        paintShop2: "D471,D472,D481,D482,D500,D501,D531,D532,D540,D561,D562,D600,D620,D650,D670,D691,D692,D700,D731,D741,D750,D800,D812,D821,D822,D841,D842",
        assembly: "F000,F100,F150,F200,F250,F300,F350,F400,F450,F500,F550,F600,F650,F700,F750,F800,F850,F900"
    };
    ...
    //Start the creation of the overview.
    function initializeOverview() {
        $scope.counters = [];
        //Iterates over the configuration.

        //Get all the status to call the query.
        var status = $scope.headers.map(function(a) {return a.status.toString();});
        //Call to create the knrs b y area.
        getKNRWithoutStatus(status.toString());


        for(var status in areas){
            getCarsWithNoStatus(areas[status]);
        }

        getNoStatusCounters("B000,C000,D000,E000,E500,F000,F100,F950,G000,G900");

    }
    // Funtion to set the counters in the table headers
    function getNoStatusCounters(status) {
         WebApiFactory.getNoStatusOrdersCounter(status).then(function (resultData) {
            Object.getOwnPropertyNames(resultData.NoStatusOrders).forEach(function(name) {
    ...
    function getCarsWithNoStatus(status) {
        // Fetch all the counters from the WebAPI
        WebApiFactory.getNoStatusOrdersCounter(status).then(function (resultData) {
            ...

    function getKNRWithoutStatus(status) {
        var orders = [];
        //Query the status monitor.
        WebApiFactory.getNoStatusOrders(status).then(function(statusMonData) {
            ...

    /** To refresh data when the clock in the footer refresh. */
    $rootScope.$on('carsWithoutStatusOverview', function(){
        initializeOverview();
        $interval(initializeOverview, Config.dataRefreshInterval * 1000)
    });

注意:我的页面无需添加 $interval 即可完美运行

【问题讨论】:

  • areas 变量是在哪里定义的?
  • 在代码开头定义为全局变量(问题编辑)
  • 我刚刚添加了更多我的代码,我不能全部粘贴,因为太长了

标签: angularjs intervals


【解决方案1】:

查看您的依赖注入。您将WebApiFactory$interval 放在$inject 列表和参数中的不同位置。 (所以$interval 变量指向您的WebApiFactory 服务,反之亦然。)

【讨论】:

  • 真的吗?这有关系吗?,我有这样的想法,但直到现在才真正使用它,所以我不相信这个位置很重要。
  • 绝对。字符串数组告诉 Angular 在哪个参数位置注入哪些注册服务。参数名本身就是任意的局部变量名。
  • 我应该注意:如果 $inject 列表被省略,Angular 将尝试提供匹配参数名称的服务。但是,如果您缩小代码,那是不可靠的。参数名称将被替换为短的一两个字母标记,Angular 将不再能够匹配它们。这就是数组语法存在的原因。字符串是缩小安全的。
猜你喜欢
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
相关资源
最近更新 更多