应由服务提供的 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 访问参数的主要内容,如果未能解决你的问题,请参考以下文章
在 Angular2 中使用生成的 Swagger TypeScript Rest Client
从Angular TypeScript中来自firestore的数据中获取未定义
在 typescript / angular2 环境和后端的 nodejs 中设置持久会话时遇到问题