应由服务提供的 Typescript Angular 访问参数

Posted

技术标签:

【中文标题】应由服务提供的 Typescript Angular 访问参数【英文标题】:Typescript Angular accessing parameter that should be delivered by service 【发布时间】:2017-01-25 17:15:58 【问题描述】:

我在访问变量时遇到问题,应该由服务解决。如果我在html中直接使用这个变量和angular没有问题,但是当我想在方法中使用它时,我什么都没有。服务工作正常,它是 http 休息服务调用。 这是控制器:

///<reference path='../domain/DocumentEntity.ts' />
///<reference path='../_app.ts'/>
module domain 
import DataAccessService = domain.DataAccessService;
import IDocument = domain.IDocument;
import DocumentEntity = domain.DocumentEntity;
import IEntity = domain.IEntity;
import Structure = domain.Structure;

interface IDocListController 
    response: IEntity;
    locations: IEntity;
    structures: IStructure[];



export class DocController implements IDocListController 
    title: string;
    response: domain.IEntity;
    locations: domain.IEntity;
    structures: IStructure[];
    static $inject = ["DataAccessService", "$scope"];

    constructor(private dataAccessService: DataAccessService, $scope) 
        this.title = "Document Listing";
        //test
        var documentResource = dataAccessService.getDataResource();
        documentResource.query((data: domain.IEntity) => 
            this.response = data;
        );
        $scope.vm = this;
        console.log($scope.vm);
        if (!this.response || !this.response.folders.length) 
            console.log("NO RESPONSE RETURNING NOTHING");
            return;
        
        this.structures = this.createFolderStructure(this.response.folders,     4);
        console.log(this.structures);

    

    createFolderStructure(folders: IFolder[], depth: number): IStructure[] 
        var structures: Structure[] = [];
        for (var i = 0; i < folders.length; i++) 
            let str: Structure = new Structure();
            str.id = folders[i].id.toPrecision();
            str.isFolder = true;
            str.name = folders[i].name;
            str.structures = this.createFolderStructure(folders, depth - 1);
            structures.push(str);
        
        console.log(structures);
        return structures;
    ;

服务看起来像这样:

  /// <reference path='../_app.ts' />
  module domain 
 import DocumentEntity = domain.DocumentEntity;

export interface IDataAccessService 
    getDataResource(): ng.resource.IResourceClass<IEntityResource>;


export interface IEntityResource extends ng.resource.IResource<domain.Entity> 


export class DataAccessService implements IDataAccessService 
    //minification protection
    static $inject = ["$resource"]

    constructor(private $resource: ng.resource.IResourceService) 
        console.log("DataAccessService Constructor");
    

    getDataResource(): ng.resource.IResourceClass<IEntityResource> 
        console.log("REST CALL");
        return this.$resource("http://localhost:8080/services/name/:searchId/documents/", searchId: "12345678", 
            'query': 
                method: 'GET',
                isArray: false
            
        );
    


angular.module("common.services", ["ngResource"]);

【问题讨论】:

【参考方案1】:

虽然您以正确的方式解决了问题,但我想指出真正的问题。真正的问题是您没有在查询请求中传递查询参数,这是第一个参数。您应该将第一个参数作为 传递给query 函数,然后我们可以分别传递成功和错误回调第二个和第三个。

代码

var documentResource = dataAccessService.getDataResource();
documentResource.query(, //1st parameter should pass as a blank
   (data: domain.IEntity) => 
     this.response = data;
   
); 

虽然另一种方法是您可以直接将 $resource 承诺对象分配给所需的变量,因此当承诺得到解决时,API 将解开该承诺并将接收到的数据分配给 this.response

this.response  = dataAccessService.getDataResource();

【讨论】:

对不起,我的源代码中的参数,但我在这里编辑帖子的真实网址时删除了它。我将编辑我的帖子。【参考方案2】:

我用 $promise 替换了控制器构造函数中的一部分。然后构造如下:

 documentResource.query((data: domain.IEntity) => 
            this.response = data;
        ).$promise.then((data)=> 
                if (this.response.folders) 
                    this.structures  = [];
                    for (let i = 0; i < this.response.folders.length; i++) 
                        if(this.response.folders)
                        Array.prototype.push.apply(this.structures,this.createFolderStructure(this.response.folders, 4));
                        
                    
                    console.log(this.structures);
                
            
        );

【讨论】:

以上是关于应由服务提供的 Typescript Angular 访问参数的主要内容,如果未能解决你的问题,请参考以下文章

Typescript - 如何访问通过命名空间声明的类?

在 Angular2 中使用生成的 Swagger TypeScript Rest Client

从Angular TypeScript中来自firestore的数据中获取未定义

在 typescript / angular2 环境和后端的 nodejs 中设置持久会话时遇到问题

升级到 Ionic 5 后,TypeScript 编译中缺少 src/zone-flags.ts

机房建设有哪些要求