我有一个Date变量,我每秒都会更新它以使其生效。
现在这是我的变量。
var stationdate = new Date(data.localTime);
我的 Javascript 代码每秒更新一次。
window.setInterval(function () {
stationdate = new Date(stationdate.setSeconds(stationdate.getSeconds() + 1));
}, 1000);
我的输入脚本代码将其返回到Angular UI。
window.setInterval(() => this.time = stationdate, 1000);
我的问题。
如果两个函数都是分离的,那么它可以完美地运行。
但如果我将它们合并就会停止工作。
见下文。
window.setInterval(function () {
stationdate = new Date(stationdate.setSeconds(stationdate.getSeconds() + 1));
this.time = stationdate;
}, 1000);
上午我错过了类型脚本的胖嘟嘟声?
什么应该是正确的功能?
答案 0 :(得分:5)
每个function
都拥有自己的this
上下文。所以你的this
引用了函数表达式中的另一个对象。对于arrow function
,它引用包含this
。
arrow function
使用箭头语法,无需在window
后面使用setInterval
前缀。
setInterval(() => {
stationdate = new Date(stationdate.setSeconds(stationdate.getSeconds() + 1));
this.time = stationdate;
}, 1000);
更多阅读 Arrow function vs function declaration/expression - 这是Javascript中的主要概念之一。
答案 1 :(得分:1)
在两种功能的组合中,您不使用箭头功能,这导致this
的上下文为window
。使用箭头函数保留this
的外部上下文。
window.setInterval(() => {
stationdate = new Date(stationdate.setSeconds(stationdate.getSeconds() + 1));
this.time = stationdate;
}, 1000);
答案 2 :(得分:1)
window.setInterval( () => {
stationdate = new Date(stationdate.setSeconds(stationdate.getSeconds() + 1));
this.time = stationdate;
}, 1000);
在您的代码中,这有错误的上下文。 胖箭头功能是ES6的功能,与TypeScript
无关答案 3 :(得分:1)
在第二个示例中,this
引用函数的内部范围,而不是最可能定义变量的外部范围。因此,正如其他人所建议的那样,您需要使用lambda符号。
此外,由于您使用的是AngularJS,因此最好使用$interval代替window.setInterval()
。
请注意,通过使用$interval
,如果您的变量已更改,则会$scope.$apply()
进行脏检查,然后更新UI。使用window.setInterval()
时,这不是给定的。或者,您仍然可以告诉$interval
不要使用$apply
,如果这是您需要的话。
答案 4 :(得分:1)
使用回调的常见错误。所有在javascript中都有自己的'这个'上下文(箭头函数除外)。只为系统功能这个=== undefined。
正确的方法是使用箭头功能(如上所示)。最适合现代浏览器(或转换代码)。
window.setInterval(() => {
stationdate = new Date(stationdate.setSeconds(stationdate.getSeconds() + 1));
this.time = stationdate;
}, 1000);
另一种存储方式'是绑定上下文:
window.setInterval((function () {
stationdate = new Date(stationdate.setSeconds(stationdate.getSeconds() + 1));
this.time = stationdate;
}).bind(this), 1000);
或更多解释:
window.setInterval(
(function(){console.log(this.hello);}).bind({hello:'hello!'})
, 1000);