api调用在一种方法中工作但在另一种方法中不起作用---TypeError:无法读取未定义的属性'getResponse'
Posted
技术标签:
【中文标题】api调用在一种方法中工作但在另一种方法中不起作用---TypeError:无法读取未定义的属性\'getResponse\'【英文标题】:api call working in one method but not working in another method ---TypeError: Cannot read property 'getResponse' of undefinedapi调用在一种方法中工作但在另一种方法中不起作用---TypeError:无法读取未定义的属性'getResponse' 【发布时间】:2018-03-26 19:00:51 【问题描述】:更新 2: 伙计们,我用 Kushpf 回答了这个问题已经解决了......但现在我又得到了另一个......我想当我要求我需要传递正确的 id 时......我什至硬编码但我仍然收到错误..你能告诉我如何修复它吗...
GET http://sports.com/Rats/color/black?RatId=20060×tamp=1508039029859 404 (Not Found)
An error occurred Response _body: ""timestamp":1508039067018,"status":404,"error":"N…ssage available","path":"/Rats/color/black"", status: 404, ok: false, statusText: "Not Found", headers: Headers, …
更新 1:我尝试了 Derek 解决方案,但仍然发生同样的错误。我打印出来并看到 self...因为我没有看到 sportsservice...有什么办法可以修复它
打印的自我价值
init elemen: M.fn.init(1), _event: …, option: …, tabl: M.fn.init(1), wrappe: M.fn.init(1), …
altRowTemplate:
ƒ ()
columns:
(13) […, …, …, …, …, …, …, …, …, …, …, …, …]
content:
[div.k-grid-content.k-auto-scrollable, prevObjec: M.fn.init(1), contex: undefined]
dataSource:
init option: …, _ma: …, _prefetc: …, _dat: init(21), _pristineDat: Array(21), …
element:
[div#animals.contractPopupkGrid.k-grid.k-widget.k-reorderable, contex: div#animals.contractPopupkGrid.k-grid.k-widget.k-reorderable]
footer:
[prevObjec: M.fn.init(1), contex: div#animals.contractPopupkGrid.k-grid.k-widget.k-reorderable, selecto: ".k-grid-footer"]
options:
prefi: "", nam: "Grid", column: Array(13), toolba: null, autoBin: false, …
pager:
init elemen: M.fn.init(1), _event: …, option: …, dataSourc: init, linkTemplat: ƒ, …
resizable:
init elemen: M.fn.init(1), _event: …, option: …, orientatio: "horizontal", _positionMous: "x", …
rowTemplate:
ƒ ()
scrollables:
(2) [div.k-grid-header-wrap.k-auto-scrollable, div.k-grid-content.k-auto-scrollable, prevObjec: M.fn.init(1), contex: undefined]
selectable:
init elemen: M.fn.init(1), _event: …, option: …, _marque: M.fn.init(1), _lastActiv: null, …
table:
[table.k-selectable, prevObjec: M.fn.init(1), contex: undefined]
tbody:
[tbody, prevObjec: M.fn.init(1), contex: undefined]
thead:
[thead, prevObjec: M.fn.init(1), contex: undefined]
wrapper:
[div#animals.contractPopupkGrid.k-grid.k-widget.k-reorderable, contex: div#animals.contractPopupkGrid.k-grid.k-widget.k-reorderable]
_cellId:
"animals_active_cell"
_data:
(10) [init, init, init, init, init, init, init, init, init, init]
_draggableInstance:
init elemen: M.fn.init(1), _event: …, option: …, _activate: false, userEvent: init, …
_errorHandler:
ƒ ()
_events:
dataBoun: Array(1)
_group:
false
_groupableClickHandler:
ƒ (n)
_isMobile:
false
_muteRebind:
false
_progressHandler:
ƒ ()
_refreshHandler:
ƒ ()
_setContentWidthHandler:
ƒ ()
_size:
widt: 960, heigh: 381
__proto__:
r
我正在尝试学习 Angular 和 typescript。
我在使用新服务时遇到错误。
但是当我通过 rxjs 使用另一个服务时,它不会抛出错误。
你能告诉我如何解决它吗?
在下面提供相关代码。
完整的代码,因为它很大,我会给出它的要点
// 此处发生错误 this.sportsservice.getResponse(vals, 'get', "")
https://gist.github.com/texirv0203/e071a9ebea3a6aa0f8a0c65d47f75807
$("#AnimalRatsGrid .RatNameFile").bind("click", function(e)
console.log("I am here");
alert("I am here");
//let params=values.selectedRow.sunDocID;
//let url='http://sun.isports.com/PdfRatViewer.aspx?Ratid='+params+'&Ratsource=DISTRIBUTIONRat'
kendo.ui.progress($("#loading"), true);
//let vals ="Rats/color/black?RatId="+values.selectedRow.RatId;
let vals ="Rats/color/black?RatId="+"7887878787";
//let vals ="Rats/color/black?RatId="+"233223232323";
this.sportsservice.getResponse(vals, 'get', "")
.subscribe(data =>
//this.saveData(data, values.selectedRow.RatName);
//this.saveData(data, "untitled.txt");
var blob = new Blob([data], type: 'application/octet-stream' );
// var blob = Blob "size": "11573", "type": "application/octet-stream"
let fire = "untitled1.txt";
this.sportsservice.saveAs(blob,fire);
//kendo.ui.progress($("#loading"), false);
,
err =>
//kendo.ui.progress($("#loading"), false);
);
);
错误
VM61482:27 TypeError: Cannot read property 'getResponse' of undefined
at htmlAnchorElement.eval (animal.ts:427)
at HTMLAnchorElement.dispatch (jquery-2.2.3.js:4737)
at HTMLAnchorElement.elemData.handle (jquery-2.2.3.js:4549)
at ZoneDelegate.invokeTask (zone.js:236)
at Object.onInvokeTask (core.umd.js:6233)
at ZoneDelegate.invokeTask (zone.js:235)
at Zone.runTask (zone.js:136)
at HTMLAnchorElement.ZoneTask.invoke (zone.js:304)
此方法没有错误
public snakeRocket(values)
let grid = $("#AnimalRatsGrid").data("kendoGrid");
let dataitem = grid.dataItem(grid.select());
grid.dataSource.remove(dataitem);
$("#divRocketAnimalRat").hide();
let snakes = [
"id": values.mainId,
"RatDtos" : [
"RatId":dataitem.RatId,
"RatName": dataitem.RatName,
"RatType": dataitem.RatType,
"RatData": this.encodeBase64,
"notes": "",
"notesId": 123,
"sunDocID": 123,
"url": "://localhost:1299/upload",
"categoryType": "",
"Timestamp": dataitem.date,
"userID": dataitem.userID,
"addedByName": dataitem.addedByName,
"operationType": "Rocket",
]
];
this.sportsService.getResponse("player/color/Rat/", "post", snakes[0])
.subscribe(data =>
if (data.code === "S001")
else
,
err =>
);
$(".k-pager-numbers li").last().find("a").click();
【问题讨论】:
你可能需要修复你的this
参考 - 在this.sportsService.getResponse
console.log('this object', this);查看它所引用的内容。
【参考方案1】:
你必须小心this
指的是什么:
在您的第二个(工作)示例中,您在设置了this.sportservice
值的类上下文中执行this.sportservice.getResponse()
。
但是,在您的错误示例中,您在传递给$().bind()
函数的回调中执行this.sportservice.getResponse()
。此回调具有不同的上下文,因此具有不同的 this
值。您可以阅读更多关于this
工作原理here 的信息。
一个简单的解决方案是创建一个对您实际想要使用的this
上下文的新引用。例如:
var self = this;
$("#AnimalRatsGrid .RatNameFile").bind("click", function(e)
console.log("I am here");
alert("I am here");
//let params=values.selectedRow.sunDocID;
//let url='http://sun.isports.com/PdfRatViewer.aspx?Ratid='+params+'&Ratsource=DISTRIBUTIONRat'
kendo.ui.progress($("#loading"), true);
//let vals ="Rats/color/black?RatId="+values.selectedRow.RatId;
let vals ="Rats/color/black?RatId="+"7887878787";
//let vals ="Rats/color/black?RatId="+"233223232323";
self.sportsservice.getResponse(vals, 'get', "")
.subscribe(data =>
//this.saveData(data, values.selectedRow.RatName);
//this.saveData(data, "untitled.txt");
var blob = new Blob([data], type: 'application/octet-stream' );
// var blob = Blob "size": "11573", "type": "application/octet-stream"
let fire = "untitled1.txt";
self.sportsservice.saveAs(blob,fire);
//kendo.ui.progress($("#loading"), false);
,
err =>
//kendo.ui.progress($("#loading"), false);
);
);
【讨论】:
更新:我尝试了 Derek 解决方案,但仍然发生同样的错误..我打印出来并看到 self...因为我没有看到 sportsservice...有什么办法可以修复它打印自我价值 @jajajaja 整个函数在什么上下文中运行?你能确保该函数也存在于this
那里吗?【参考方案2】:
Derek 的解释是对的,但是声明var self = this;
的地方是错误的。
由于this.sportsservice.getResponse
在$("#AnimalRatsGrid .RatNameFile").bind("click", function(e)
内被调用,而$("#AnimalRatsGrid .RatNameFile").bind("click", function(e)
本身在dataBound: function(e)
内,您需要在其外部声明self。
但是,您已经声明了一个变量let that = this;
,其用途完全相同。所以不要使用this.sportsservice.getResponse
,而是使用that.sportsservice.getResponse
。
//let vals ="Rats/color/black?RatId="+"233223232323";
that.sportsservice.getResponse(vals, 'get', "")
.subscribe(data =>
另外,考虑将that
重命名为self
,以便其他开发人员更容易理解(self
是用于此目的的通用标识符)
【讨论】:
那个问题已经解决了......但现在我又得到了另一个......我想当我要求我需要传递正确的 id 时......我什至硬编码但仍然出现错误......可以你告诉我如何解决它... GET sports.com/Rats/color/… 404 (Not Found) 发生错误响应 _body: ""timestamp":1508039067018,"status":404,"error":"N...ssag跨度> 你能告诉我为什么我们需要声明外部数据绑定函数......你能解释一下......这样我以后就不会遇到这个问题了...... 嘿,如果我将调试器保留在订阅方法中,它就不会进入...任何想法:( 您可以使用日志记录进行检查。如果有帮助,请采纳答案。以上是关于api调用在一种方法中工作但在另一种方法中不起作用---TypeError:无法读取未定义的属性'getResponse'的主要内容,如果未能解决你的问题,请参考以下文章
数据方法中的数组在一种方法中得到更新,但在另一种方法中仍然为空
为什么这个lambda表达式在语句中不起作用,但在方法中工作?
xctest 如何在另一种测试方法中使用在一种测试方法中捕获的数据