【问题标题】:Knockout : find out which observable triggerred computedKnockout : 找出计算出的 observable triggerred
【发布时间】:2014-07-15 08:14:08
【问题描述】:

我有一个包含多个可观察对象的对象。计算中有没有办法知道哪些可观察的变化,因此哪个可观察触发了计算?

提前谢谢你 马修

【问题讨论】:

  • 这里建议使用扩展器来确定 observable 是否脏:stackoverflow.com/questions/10622707/… 这将允许您检查您的计算注册的 observables。
  • 您希望通过这个实现什么目标?只是想知道是否有另一种方法可以在计算之外做你想做的事情
  • 我最终使用了下面的解决方案,就像之前我使用计算检查每个对象并检查属性是否已更改这非常慢所以我以这种方式订阅每个对象我不需要检查触发了什么。

标签: javascript knockout.js


【解决方案1】:

如果没有详细说明您要达到的目标,我将发布此内容,希望对您有所帮助。

跟踪更改的一种简单方法是在要跟踪的 observable 上使用 .subscribe 方法。每次可观察对象更新时,都会触发此方法。

self.myValue = ko.observable('initial value');

self.myValue.subscribe(function (item) {
    alert('myValue has changed to: ' + item);
});

传入订阅函数的item是可选的,因此如果需要,您可以使用新值。

这是一个使用计算的简单示例:

Sample JSFiddle

JS:

var viewModel = function () {
    var self = this;
    self.firstName = ko.observable('Mod');
    self.lastName = ko.observable('dinu');

    self.valueChanged = ko.observable('');

    self.fullName = ko.computed(function () {
        var val = '';
        if (self.valueChanged() !== '') {
            val = ' (' + self.valueChanged() + ' Changed)';
        }

        return self.firstName() + ' ' + self.lastName() + val;
    });

    self.firstName.subscribe(function () {
        self.valueChanged('First Name');
    });

    self.lastName.subscribe(function () {
        self.valueChanged('Last Name');
    });
};

ko.applyBindings(new viewModel());

HTML:

<div>
    <label for="fname">First Name:</label>
    <input id="fname" data-bind="value: firstName" />
</div>
<div>
    <label for="lname">Last Name:</label>
    <input id="lname" data-bind="value: lastName" />
</div>
<hr />
<div>Hello <span data-bind="text: fullName"></span></div>
<hr />
<div>Value Changed: <span data-bind="text: valueChanged"></span></div>

【讨论】:

  • 谢谢,这就是我最终要做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 2014-07-03
  • 2016-05-11
  • 2017-12-13
  • 2014-08-11
  • 2014-10-01
相关资源
最近更新 更多