【问题标题】:Typescript Angular accessing parameter that should be delivered by service应由服务提供的 Typescript Angular 访问参数
【发布时间】: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"]);
}

【问题讨论】:

    标签: javascript angularjs typescript


    【解决方案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);
                    }
                }
            );
    

    【讨论】:

      猜你喜欢
      • 2018-04-12
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      相关资源
      最近更新 更多