【问题标题】:How to emit events in Knockout between separate view models如何在 Knockout 中在不同的视图模型之间发出事件
【发布时间】:2016-02-21 03:35:21
【问题描述】:

我来自 Angular(有/有事件发射),我看到 Knockout 有 'observables'/pubsub,但使用单独的视图模型我无法完全掌握这个概念。

这是我正在尝试做的一个示例:

我在 VM1 中有一个对象数组,当一个元素被更新时,我想发出一个事件,说“这个对象已经改变,请相应地更新!”并且还传递了对象。

我在KO documentation 上找到了这个:

对于高级用户,如果您想注册自己的订阅以在可观察对象发生更改时收到通知,您可以调用他们的订阅函数。

myViewModel.personName.subscribe(function(newValue) {
    alert("The person's new name is " + newValue);
});

但它没有提及谁在发布对“myViewModel”的任何更改。谁能澄清一下?

在我的示例中,我是否将一个可观察数组绑定到父对象(可能是 ko)?

编辑:

示例如下:

一个用户至少有一个用户可以管理。

我有一个虚拟机负责显示单个用户的用户帐户设置页面。我有另一个 VM 负责一次显示所有用户的用户。如果用户单击一行(用户的用户),则会出现一个面板来更改该行的数据。当一行发生变化时,我想更新用户用户的主列表。

【问题讨论】:

  • 你能想出一个最小但详细的例子来说明你正在寻找的那种行为吗?我不太明白为什么你需要知道是谁做出了改变,或者为什么你有单独的视图模型。

标签: javascript knockout.js publish-subscribe


【解决方案1】:

我建议您将这些视为components 而不是虚拟机。您的应用程序应该有一个 VM,它将使用这些组件。它还将拥有他们需要共享的任何数据项。在您的示例中,当前正在编辑的用户记录将由主 VM 拥有并在其初始化时传递给组件。所有用户组件可以设置当前记录的值,单用户组件将显示并允许编辑这些值。 all-users 组件可以订阅更新并做出相应的响应。

在我看来,组件并不关心在改变值,他们只想知道他们所依赖的值何时改变。我们的想法是为任何不同的、独立的数据项创建一份副本,并在需要使用它的组件之间共享。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多