Aurelia打印“观察者”而不是对象

Aurelia打印“观察者”而不是对象,aurelia,Aurelia,我正在尝试将对象从视图模型绑定到视图,如下所示: // welcome.js export class Welcome { constructor() { this.data = { a: "", b: "", c: "" } } submit() { console.log(this.data); } } // welcome.html <form role="form" submit.dele

我正在尝试将对象从视图模型绑定到视图,如下所示:

// welcome.js
export class Welcome {

constructor() {
    this.data = {
        a: "",
        b: "",
        c: ""
    }
}

submit() {
       console.log(this.data);
    }
}


// welcome.html
<form role="form" submit.delegate="submit()">
    <div class="form-group">
      <textarea class="form-control" value.bind="data.a" rows="3"></textarea>
    </div>
    <button type="submit" class="btn btn-default">Submit</button>
</form>
//welcome.js
欢迎参加出口班{
构造函数(){
此参数。数据={
a:“,
b:“,
c:“
}
}
提交(){
console.log(this.data);
}
}
//欢迎光临
提交
理想情况下,它应该只打印
数据
对象。但是,它会在控制台中打印以下输出

我想知道什么是
观察者
对象,以及如何仅访问
数据
对象。多谢各位

简短答复:
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。如果你真的需要精确地提取你想要的东西,那么你需要手工提取

更深入一点 通常,当您在viewmodel上定义一些数据时,开发人员通常不介意显式设置属性,而是使用字段表示法,因为这样更简洁。然而,字段只是字段,读取或赋值时发生的情况不能更改1

无论何时通过任何方式绑定到的属性(例如在模板插值(
${data.a}
)或绑定(
)中使用它)发生更改,Aurelia都需要一种在值更改时收到通知的方法,以便它可以更新依赖它的任何内容,例如视图的一部分

由于1,如果某个内容被定义为字段,则不可能。因此,Aurelia所做的是动态地将类中的字段转换为属性,因为它们仍然允许使用
x=1
符号(处理字段时使用的符号),而不像Java风格的get set方法(
setX(1)
)让您的代码完全按照预期工作,但它们也允许在getter和setter中执行任意逻辑。当它将字段转换为属性时,它还注入了自己的一些逻辑,每当值发生变化时就会通知Aurelia

这就是为什么这些东西会被添加到你的对象中,这就是为什么你不能摆脱它们。为了使框架能够发挥作用,它们是绝对必要的


当然,另一方面,还有其他方法可以实现更改检测,但每种方法都有自己的特点。例如,在Angular中,这不是必需的:

Angular在每个更改检测周期后执行模板表达式。更改检测周期由许多异步活动触发,如承诺解析、http结果、计时器事件、按键和鼠标移动

当然,这会带来不同的复杂性,例如您需要时不时地编写这样的代码来设置一些值:

setTimeout(() => this.someVal = 0, 0);
在我看来,这真是令人讨厌


因此,基本上有两种方法可以让框架在发生更改时得到通知。一种是奥雷利亚方式,另一种是角度方式

Aurelia方式带来了您所询问的后果,也就是说,它为您的对象添加了一些其他内容


另一方面,Angular需要如上所述的黑客解决方案,人们可能还想知道响应大多数异步事件进行更改检查的性能影响。

要获得普通对象,可以使用克隆技术:
console.log(JSON.parse(JSON.stringify(this.data)))

Man。。这是一个豪华轿车式的回答。这个回答冗长而无益。