【发布时间】: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