我一直在尝试确定为什么计算值上的写入函数至少不会自动触发突变事件。
我所说的一个例子:
<span data-bind="text: fullName"></span>
<input data-bind="value: fullName"/>
使用以下 JavaScript。
<script type="text/javascript">
function MyViewModel() {
this.firstName = 'first';
this.lastName = 'last';
this.fullName = ko.computed({
read: function () {
return this.firstName + " " + this.lastName;
},
write: function (value) {
var lastSpacePos = value.lastIndexOf(" ");
if (lastSpacePos > 0) { // Ignore values with no space character
this.firstName = value.substring(0, lastSpacePos); // Update "firstName"
this.lastName = value.substring(lastSpacePos + 1); // Update "lastName"
}
},
owner: this
});
}
ko.applyBindings(new MyViewModel());
我理解这种情况的发生,因为 firstName 和 lastName 不是可观察的,但我不明白为什么。即使底层数据在其他地方单独使用,至少任何使用 fullName 的字段都会更新,这似乎是合乎逻辑的。
所以我的问题具体是:
- 为什么会这样?
- 如果你不想观察名字或姓氏,你怎么能绕过它?