【问题标题】:Uncaught TypeError: Cannot set property 'rowsdata' of undefined未捕获的类型错误:无法设置未定义的属性“rowsdata”
【发布时间】:2016-11-08 01:57:26
【问题描述】:

我在某个时候被困在使用 node js 的角度 2 上。下面是我的代码。它无法将 rows(variable) 设置为 this.rowsdata (variable)。 我认为背后的原因是节点Js使用异步调用。可能这就是 this.rows 数据未定义行的原因。

/// <reference path="../typings/node/node.d.ts" />
import { Component } from 'angular2/core';
import { OnInit } from 'angular2/core';

declare var module : any;
declare var jQuery : any;
var rowsdata : any[] = [];
// self = this;
interface ROWS {
name : string,
current_balance : number
}

@Component({
selector : 'portfolioList',
templateUrl : '../app/view/portfoliolist.html',
moduleId : module.id
})

export class PortfolioList implements OnInit {
 // self : any = this;

constructor() {
 // var self : this;
}

ngOnInit(): any {
 this.showdata();
 // console.log(this.rowsdata);
}

showdata() {
 console.log("called");
 var portfolioList = require('../app/api/showPortfolio.js');
 portfolioList.showPortfolio(function(err:any, rows:any) {
   console.log(rows);
   // self.rowsdata = rows;
   this.rowsdata = rows;
 });

 // console.log(self.rowsdata);

 console.log(rowsdata);
 }
}

这里是 showPortfolio 函数

    exports.showPortfolio = function(callback) { 
db.all(squel .select() 
.from("portfolios") 
.field("name") 
.field("current_balance") .toString() , function(err, rows) {      callback(null, rows) }); 
}

【问题讨论】:

  • console.log(this) 在设置行数据之前。它应该打印“未定义”。所以你不能设置未定义对象的属性。这就是信息
  • 我没有将console.log(this) 写到程序中的任何地方。我想将作为对象数组的行设置为行数据。所以我可以在 angular2 html 模板中使用 *ngFor 中的 rowsdata。希望你能理解。
  • 我知道你不知道,我只是告诉你这样做是为了查看错误。 basarat 给出了解决问题的答案。胖箭头是在函数内部引用this的解决方案
  • 我尝试了他的建议。仍然得到同样的错误。我认为我得到这个的原因是因为 node Js 使用异步调用函数。所以在得到结果之前,它将执行this.rowsdata = rows 行,因为它在行中什么都没有。所以它会抛出未定义的错误。
  • showdata() { console.log("called"); var portfolioList = require('../app/api/showPortfolio.js'); portfolioList.showPortfolio(function(err:any, rows:any) { console.log(rows); // self.rowsdata = rows; this.rowsdata = rows; }); // console.log(self.rowsdata); console.log(rowsdata); } }

标签: node.js asynchronous typescript angular electron


【解决方案1】:

在您的代码中:

portfolioList.showPortfolio(function(err:any, rows:any) {

把它改成粗箭头:

portfolioList.showPortfolio((err:any, rows:any) => {

更多

https://basarat.gitbooks.io/typescript/content/docs/arrow-functions.html

【讨论】:

  • 你确定吗?还将showdata() { 更改为showdata = () =&gt; { 这在箭头函数文档中也有提及?
  • showdata = () => { console.log("call"); portfolioList.showPortfolio((err:any, rows:any) => { // console.log(rows); // self.rowsdata = rows; this.rowsdata = rows;}); // console.log(self.rowsdata);控制台.log(this.rowsdata); }
  • 见上面的代码。我变了。很抱歉格式不正确。
  • 这将是一个很大的帮助。如果你解决了我的问题。我在这里呆了两天。
  • 您好,请帮帮我。
【解决方案2】:

我无法对所有这些代码发表评论,所以我发布了答案。 它应该像这样工作。我放了一些额外的日志。

showdata() {
 console.log("called");
 var _this = this;
 console.log(_this);
 var portfolioList = require('../app/api/showPortfolio.js');
 portfolioList.showPortfolio(function(err:any, rows:any) {
   console.log(rows);
   console.log(_this);
   _this.rowsdata = rows;
 });

 // console.log(self.rowsdata);

 console.log(rowsdata);
 }
}

【讨论】:

  • 我正在以“老式”方式发布答案,但我很确定 basarat 的解决方案有效。
  • 仍然没有得到最后一个 console.log(rowsdata) 中的 rowsdata 中的行。我很震惊,因为当我只打印第一个 console.log(_this) 第一个时,我得到了实际的预期值,但最后无法将行设置为 rowsdata。
  • 好的,但这是解决问题的一步。你没有得到你的标题所说的Cannot set property 'rowsdata' of undefined 错误!
  • showPortfolio函数的定义是什么?你的问题中没有它
  • 是的。但仍在 rowsdata 变量中。它是未定义的。
猜你喜欢
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 2011-03-11
  • 2013-06-16
相关资源
最近更新 更多