【问题标题】:AngularJS foreach not able to find function within same ServiceAngularJS foreach 无法在同一服务中找到功能
【发布时间】:2019-02-07 09:20:33
【问题描述】:

需要一些帮助,我这辈子都做不到。我正在尝试遍历配置值内的数组,然后在我创建的服务中触发另一个函数,但出现错误

TypeError: Cannot read property 'registerToken' of undefined

有没有更好的方法来做到这一点,感觉很笨重?

CampaignService.ts

import { ServerConfig } from "../core/ServerConfig";

declare var config: ServerConfig;

export class CampaignService {
  static $inject = ["localStorageService"];

  constructor(
    public localStorageService: angular.local.storage.ILocalStorageService
  ) {

  }             

  launchCampaign(campaignToken: string) {
    if (campaignToken) {
      config.campaigns.forEach(function (data) {
        if (campaignToken == data.title) {
          if (data.enabled) {
            this.registerToken(campaignToken);
          }
        }
      });
    }
  };

  registerToken(campaignToken: string) {

  }    

}

【问题讨论】:

    标签: arrays angularjs typescript


    【解决方案1】:

    另一种方法是将外部“this”传递给forEach函数,然后foreach定义“this”上下文。

    类似:

    config.campaigns.forEach(function (data) {
        if (campaignToken == data.title) {
          if (data.enabled) {
            this.registerToken(campaignToken);
          }
        }
    }, this);
    

    可以参考foreachhere的文档。

    【讨论】:

      【解决方案2】:

      经过一番调查,我发现这是最好的速记可能是错误的,欢迎 cmets

      import { ServerConfig } from "../core/ServerConfig";
      
      declare var config: ServerConfig;
      
      export class CampaignService {
        static $inject = ["localStorageService"];
      
        constructor(
          public localStorageService: angular.local.storage.ILocalStorageService
        ) {
      
        }             
      
        launchCampaign(campaignToken: string) {
          if (campaignToken) {
             (config.campaigns.find(function (obj) { return obj.title === campaignToken; })) ? this.registerToken(campaignToken) : void (0);
          }
        };
      
        registerToken(campaignToken: string) {
      
        }    
      
      }
      

      【讨论】:

        【解决方案3】:

        您需要使用具有上下文的 arrow function

         config.campaigns.forEach((data) => {
                if (campaignToken == data.title) {
                  if (data.enabled) {
                    this.registerToken(campaignToken);
                  }
                }
         });
        

        【讨论】:

        • 非常感谢@sajeetharan 的小事,这些小事让我花了好几个小时。我看到这似乎也有效var obj = config.campaigns.find(function (obj) { return obj.title === campaignToken; });
        • 如果有帮助就太好了
        猜你喜欢
        • 1970-01-01
        • 2017-08-29
        • 2014-12-20
        • 2017-10-04
        • 2020-09-25
        • 2014-07-10
        • 2021-12-10
        • 1970-01-01
        • 2019-01-15
        相关资源
        最近更新 更多