Knockout.js计算了当下属数据为't观察到
Knockout.js computed write not firing mutation event when underling data isn't observed
我一直在试图确定为什么计算值上的写函数不会自动触发突变事件,至少不会在其自身上触发突变事件。
我所说的一个例子:
<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的字段都会更新,这似乎是合乎逻辑的。
所以我的问题具体是:
- 为什么会发生这种情况
- 如果你不想观察firstName或lastName,你怎么能避开它
http://jsfiddle.net/TWR6Y/
这与依赖项跟踪的工作方式有关。
- 每当您声明一个计算的可观察对象时,KO会立即调用其evaluator函数以获取其初始值
- 而你的评估者函数正在运行,KO会记录任何可观测值(或计算值可观察性(的值
- 当您评估器完成后,KO为每个你接触过的可观察性(或计算的可观察性(。这个订阅回调设置为使您的计算器再次运行,将整个过程循环回到步骤1(处理任何旧的不再适用的订阅(
- KO通知任何订阅者您计算的可观测值的新值
由于firstName
和lastName
不是ko.observable
的,KO不会将它们添加到日志中(请参见步骤2(。因此,您的代码(没有可观察性(将无法工作。
进一步总结答案。在这个问题和更新时,Javascript无法为本机类型提供事件处理。Knockout通过处理数据来创建一个拦截点,从而可以看到对象的突变,从而克服了这个问题。在不拦截的情况下观察本地人的唯一方法是扫描,这是低效的。
这个问题将通过对象来克服。观察.
相关文章:
- 无法在关闭弹出窗口时传递可观察的数据
- 如何正确处理依赖ViewChild和Angular 2中可观察到的数据的组件上的更改检测
- 挖空映射:加载数据后,父模型中的计算可观察量不会更新
- 在jQuery数据表中使用AngularJS观察者的方法是什么
- 挖空模板:afterRender 触发两次,因为名称/数据是耦合的可观察量
- 合并可观察量 A 和 B:仅当 A 有数据时才应触发;如果数据或默认值,则从 B 获取
- 将 breeze 谓词应用于可观察数组中的数据
- 角度类型提前:观察数据集的变化
- 挖空.js在数据绑定声明中分配可观察
- 使用 Angular 2/RxJs 5 beta 可观察从 while 循环流式传输数据
- 数据绑定到可使用 javascript 在地铁风格的应用程序中观察到
- 根据异步数据计算的可观察量
- 使用剑道可观察数组、模板和数据绑定
- 余烬数据观察混乱
- Ember Data 1.0 - 如何在数据加载时触发模型上的观察器
- 在数据绑定表达式中,何时使用或不使用带可观察性的括号
- 突变观察者字符数据使用情况,没有子列表
- AngularJS数据绑定——观察周期不触发
- 过滤淘汰可观察数组时没有数据存在
- Angular JS从服务方法中观察数据