observables 的值相互依赖 - 循环引用
observables dependent on one another for their own values - circular references
可能是一个淘汰新手的问题。这周才开始学knockout
我有两个 observables - 宽度和高度。这些值最初是通过抓取点击元素的宽度和高度来设置的,因此这部分不需要计算。问题是,一旦捕获了初始值,我想为所有未来的变化保持纵横比。因此,如果用户更新宽度,我希望高度根据纵横比(原始宽度/原始高度)更新。所以当用户改变宽度时,高度必须改变,反之亦然。
我已经尝试过使用订阅者进行此操作,但这会导致您可能预料到的无限循环,因为宽度的任何变化都需要高度的变化,反之亦然。我已经研究了计算的可观察量和扩展器,但我不确定哪一个是正确的答案,尽管这可能是由于我在淘汰赛方面的经验有限。
如有必要,我可以提供一些代码,但我认为如果可能的话我会尽量保持概念化。只是指出我正确道路的东西。
感谢您的帮助!
与任何循环依赖一样,您必须打破循环。与其拥有两个相互依赖的可观察对象,不如让它们依赖于一个或多个共同的可观察对象。可以保持该比率的 Observables。
例如,
function Proportional (width, height) {
var _ratio = width / height,
_width = ko.observable(width),
_height = ko.observable(height);
this.width = ko.dependentObservable({ read: _width, write: setWidth });
this.height = ko.dependentObservable({ read: _height, write: setHeight });
function setWidth(width) {
_width(width);
_height(width / _ratio);
}
function setHeight(height) {
_height(height);
_width(height * _ratio);
}
}
function ViewModel(data) {
var p = new Proportional(data.width, data.height);
this.width = p.width;
this.height = p.height;
}
可能是一个淘汰新手的问题。这周才开始学knockout
我有两个 observables - 宽度和高度。这些值最初是通过抓取点击元素的宽度和高度来设置的,因此这部分不需要计算。问题是,一旦捕获了初始值,我想为所有未来的变化保持纵横比。因此,如果用户更新宽度,我希望高度根据纵横比(原始宽度/原始高度)更新。所以当用户改变宽度时,高度必须改变,反之亦然。
我已经尝试过使用订阅者进行此操作,但这会导致您可能预料到的无限循环,因为宽度的任何变化都需要高度的变化,反之亦然。我已经研究了计算的可观察量和扩展器,但我不确定哪一个是正确的答案,尽管这可能是由于我在淘汰赛方面的经验有限。
如有必要,我可以提供一些代码,但我认为如果可能的话我会尽量保持概念化。只是指出我正确道路的东西。
感谢您的帮助!
与任何循环依赖一样,您必须打破循环。与其拥有两个相互依赖的可观察对象,不如让它们依赖于一个或多个共同的可观察对象。可以保持该比率的 Observables。
例如,
function Proportional (width, height) {
var _ratio = width / height,
_width = ko.observable(width),
_height = ko.observable(height);
this.width = ko.dependentObservable({ read: _width, write: setWidth });
this.height = ko.dependentObservable({ read: _height, write: setHeight });
function setWidth(width) {
_width(width);
_height(width / _ratio);
}
function setHeight(height) {
_height(height);
_width(height * _ratio);
}
}
function ViewModel(data) {
var p = new Proportional(data.width, data.height);
this.width = p.width;
this.height = p.height;
}