【问题标题】:How to use $rootScope define in one angular service in another service using typescript如何使用打字稿在另一个服务中的一个角度服务中使用 $rootScope 定义
【发布时间】:2016-07-30 05:06:38
【问题描述】:

我已经在服务类(在构造函数中)中声明了一个 $rootScope 并在使用 this.$rootScope 的方法中分配并为其分配属性,当我想在该类中再次在另一个服务中使用时,我在构造函数中声明正在创建新的 $rootScope 并且该属性未定义

如何解决这个问题?可能吗 ?以及我们如何在角度上做??

我已经发布了这个问题 unable to access $rootscope property declared in one controller in other in angular using typescript

编辑: 如回答中所说,如果我编写了类似

的代码
     export class DataService {

        betterApproach = "value";

        constructor(private $rootScope: any){
            $rootScope.someProperty ="some value";

        }


    setBetterApproach(data){
          this.betterApproach=data;
    }
        getBetterApproach() {
            return this.betterApproach;
        }
    }

    angular.module("services").service("dataService", ['$rootScope', DataService]);

        angular.module("services").service("dataService", ['$rootScope', DataService]);

How shoud I use??

        export class ConsumingService{
    test:any;
    constructor(private $rootScope: any ,
                private dataService : DataService ){

        this.test = $rootScope.someProperty;

        this.test = dataService.getBetterApproach();  // Still returns old value
    }


}

angular.module("services").service("ConsumingService", ['$rootScope', 'DataService',ConsumingService]);

所以当我打电话给 setsetBetterApproach 时你呢?在 DataController 中如何?

    class DataCtrl{

    constructor(private dataService: Dataservice){

       }


    myData(){
     //this is ng-Click function
    this.dataService.setBetterApproach("new Data");
    }
}

有些地方我搞砸了,但仍然在 betterApproach 中获得价值,而不是 newData

【问题讨论】:

  • 您最好使用服务共享数据,这些服务是单例,而不是使用全局。全局变量被认为是不好的做法,你应该尽量避免它们
  • 我也想使用服务,因为它们是单身,但如何?当我在构造函数中创建我想要的服务时,我想使用它正在创建新变量。
  • 很抱歉,但很难理解您要做什么。你能澄清一下吗?
  • 我不明白这有什么难理解的?我在服务中声明了一个变量,并想在另一个服务中使用它......!在构造函数中,当我创建必须使用数据的服务实例时,数据不会持久化..!你收到了吗???我们有角度的 rootscope 可以根据需要共享一些数据,比如 global 所以我认为使用它......两者都不起作用!!!
  • 首先你应该整理你的代码并完全删除$rootScope。你确定你的 myData() 方法真的被调用了吗?您正在尝试在构造函数中使用黄油方法。在那里,您将永远无法从 myData() 获取更改的数据

标签: javascript angularjs typescript typescript1.5


【解决方案1】:

您想使用相同的 $rootScope 实例吗?

那么你应该将你的 $rootScope 注入你的服务,但不要创建新的......

喜欢:

export class DataService {

    betterApproach = "value";

    constructor(private $rootScope: any){
        $rootScope.someProperty ="some value";

        betterApproach = "other value";
    }

    getBetterApproach() {
        return this.betterApproach;
    }
}

angular.module("services").service("dataService", ['$rootScope', DataService]);

消费服务:

export class ConsumingService{
    test:any;
    constructor(private $rootScope: any ,
                private dataService : DataService ){

        this.test = $rootScope.someProperty;

        this.test = dataService.getBetterApproach();
    }


}

angular.module("services").service("ConsumingService", ['$rootScope', 'DataService',ConsumingService]);

为什么你的例子不起作用:

  • 您必须编写 this.test 才能访问您的类变量
  • $rootScope 可能不是来自 ng.cookies.ICookieStoreService 类型,请为 $rootScope 创建自己的接口

当您将 DataService 注入到您的 Consumingservice 中时,您根本不需要 $rootScope,请查看 betterApproach,您甚至可以像 dataService.betterApproach 一样直接访问它,但使用 getter 函数是一种方式更清洁。

【讨论】:

  • @kabaeher 我已编辑问题,请检查问题
  • @kabaeher 我现在已经编辑了问题,我无法检索数据。请检查我是否更新了问题
【解决方案2】:

要使用您创建的 dataService,您需要编写:-

import {DataService} from 'pathName';

以上部分的基本实现是:-

为 DataService 类声明一个接口,用于抽象变量/方法。

export interface IfcDataService {
    getShare(): string;
    setShare(data: string): void;
}

导入dataService接口并在其中定义其功能。

import {IfcDataService} from 'pathName for IfcDataService';

export default class DataService implements IfcDataService{
   public share: string = "injectDataService";

   constructor(){

   }

   public getShare(): string{
       return this.share;
   }

   public setShare(data: string): void{
       this.share = data;
   }
}

DataService.$inject=[];

要在另一个服务类中使用 dataService,请导入其接口方法。

import {IfcDataService} from 'pathName'
import {IfcUseDataService} from 'pathName'

export class UseDataService implements IfcUseDataService{


public dataService: IfcDataService;

constructor (dataService: IfcDataService) {
   this.dataService = dataService;
}

    public useDataService() {
       console.log(this.dataService.getShare());
    }
}

UseDataService.$inject = ['DataService'];

不要在 $rootScope 上定义公共变量,它可能会影响您的测试。 在 dataService 中为全局变量定义 setter 和 getter 并注入 dataService.ts 以在各自的位置使用它。

请参考For large scale application see architecture and github code

【讨论】:

  • 我在上面尝试过,但我得到的只是“injectDataService”值,而不是我设置的数据
  • 你在主App上注册服务了吗?
  • angular.module("SameModuleNameAsService").controller("sumptionController", ['DataService',sumptionController]);
  • angular.module("SameModuleNameAsService").service('DataService', DataService);查看答案中给出的链接。有关更多信息,请参阅其 github 项目。
  • 实际上我在控制器函数中设置服务变量并重定向到另一个html页面usnig window.href,是因为它没有维护状态??
猜你喜欢
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 2012-08-01
相关资源
最近更新 更多