Aurelia 取消订阅事件聚合器

2024-01-21

我在用Aurelia Framework with Typescript并在event aggregator我能够发布和订阅频道。

问题是我无法取消订阅频道。

注意:所有形式的 subscribe 方法都会返回一个 dispose 函数。您可以调用该函数来销毁订阅并停止接收消息。一个好的处理位置是在视图模型的停用回调中(如果它由路由器管理),或者在其分离的回调中(如果它是任何其他视图模型)。

这是取自aurelia 官方文档网站 http://aurelia.io/docs.html#the-event-aggregator我似乎不太明白如何实现这一点。

我去了奥里莉亚吉特频道 https://gitter.im/Aurelia/Discuss我发现了 3 个与此相关的讨论,其中一个给出了以下取消订阅的示例:

sub = ea.subscribe();

//unsubscribe the event
sub();

问题是这段代码在 TypeScript 中不起作用。

我如何取消订阅event aggregator在打字稿中?

现在,使用这段代码

    @inject(Publisher, Subscriber)
export class Home {
    publisher: Publisher;
    subscriber: Subscriber;
    channelName = "testChannel";

    constructor(pub: Publisher, sub: Subscriber) {
        this.publisher = pub;
        this.subscriber = sub;

        this.subscriber.subscribe(this.channelName);

        this.publisher.publish(this.channelName, "Ana are mere");
    }
}


@inject(EventAggregator)
export class Publisher {
    eventAggregator: EventAggregator = null;

    constructor(agg: EventAggregator) {
        this.eventAggregator = agg;
    }

    publish(channelName: string, object: Object) {
        this.eventAggregator.publish(channelName, object);
    }
}


@inject(EventAggregator)
export class Subscriber {
    eventAggregator: EventAggregator = null;

    constructor(agg: EventAggregator) {
        this.eventAggregator = agg;
    }

    subscribe(channelName: string) {
        this.eventAggregator.subscribe(channelName, object => {
            //TODO do something with received object
            alert(object);
        });
    }
    unsubscribe(channelName: string) {
        debugger;
    }
}

当执行Home在组件中, subscribe 方法不会只执行一次,而是与构造函数被调用的次数一样多。所以,如果我进入主页 3 次,它就会被执行 3 次。

所以: 为什么我的订阅者方法被多次触发? 我如何取消订阅event-aggregatoor在打字稿中?

Thanks!


2015 年 10 月 14 日 编辑

The EventAggregator class's subscribe function returns a "dispose" function "subscription" object:

var subscription = eventAggregator.subscribe('some event', value => alert(value));

您需要保留对订阅对象的引用,以便在不再需要订阅时可以销毁订阅。

在视图模型中,订阅事件的最佳时间是当它发生时attached。同样,取消订阅的最佳时机是detached.

这就是你的Home如果使用这种模式,view-model 看起来会像这样(注意:我已经删除了您的 Subscriber 和 Publisher 类,因为我认为它们在 EventAggregator 周围增加了不必要的复杂性,并且很难解释您的问题的解决方案)。

@inject(EventAggregator)
export class Home {
  eventAggregator: EventAggregator;
  subscription: { dispose: () => void };

  constructor(eventAggregator: EventAggregator) {
    this.eventAggregator = eventAggregator;
  }

  attached() {
    this.subscription = this.eventAggregator.subscribe('some event', value => alert(value));
  }

  detached() {
    this.subscription.dispose();
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Aurelia 取消订阅事件聚合器 的相关文章

随机推荐

  • 在 Windows Phone 8.1 中使用加速度计传感器数据在画布上绘制线条

    我正在根据设备移动在画布上绘图 我想根据移动移动在画布上绘制不同的字符 目前它正在工作 但我想找到时间差 并且我想检测暂停 暂停意味着用户没有尝试绘制并且用户没有移动手机 因此应用程序可以假设现在用户想要绘制下一个字符 如何找到加速度计值的
  • 打散列

    哈希上的 splat 将其转换为数组 foo bar gt foo bar 这里是否存在一些隐藏机制 例如隐式类转换 或者它是内置的原始功能 除了数组之外 还有nil并哈希唯一在 Ruby 1 9 下使用 splat 运算符消失 改变的东西
  • 在 C 中等待/暂停一定秒数

    我编写了一个小控制台应用程序 我希望它在循环 一段时间 再次开始之前暂停一定的秒数 我正在使用 Windows 操作系统 在 Windows 上 执行此操作的函数是Sleep 这需要量毫秒你想睡觉 使用Sleep 你需要包括windows
  • SQL Server 函数获取层次结构中的顶级父级

    我有下表 master group 结构 code name under 1 National Sales Manager 1 2 regional sales manager 1 3 area sales manager 2 4 sale
  • 使用 Python requests 模块发出 SOAP 请求

    我使用 python requests 模块来处理 REST 请求 我正在尝试提出肥皂请求 但我想知道无法获得这方面的示例 这是我的肥皂体和标题
  • IEqualityComparer 和 IEquatable 之间有什么区别?

    我想了解场景IEqualityComparer
  • 输出不正确。 C++ 入门 1.4.4

    下面的程序应该计算用户输入整数的次数 示例 用户输入 42 42 10 10 程序应该输出 42 出现 2 次 10 出现 2 次 问题 代码不会输出数字 10 的最后结果 直到您输入另一个数字 我已经粘贴了下面的代码 这段代码来自c 底漆
  • 如何在 Android 应用程序中从 WordPress 博客检索帖子?

    我正在尝试开发一个 Android 应用程序来浏览我拥有的由 Wordpress 驱动的博客 我正在尝试弄清楚如何从博客中检索帖子和其他信息以在应用程序中显示 我已经看遍了一切 但我感觉完全迷失了 这是完全可以用 Java XML 完成的事
  • 如何捕获 urllib.urlretrieve 中的 404 错误

    背景 我正在使用urllib urlretrieve http docs activestate com activepython 2 6 python library urllib html 与任何其他函数相反urllib 模块 因为钩子
  • 在文件的某个位置(行和列)启动 Vim

    要从特定行开始 我将使用 vim FILE LINE 但是需要向 vim 传递什么参数才能将光标定位到该行的某一列呢 一种方法是 vim call cursor
  • Subgit:避免将 git 分支同步到 svn

    我正在尝试使用SubGit http subgit com 但我面临着分支的问题 我希望在 Git 下创建的分支仅在 Git 中生存和消亡 我找到了这个 SubGit 如何排除分支 https stackoverflow com quest
  • 如何从 Hibernate Validator 检索默认验证消息?

    我正在尝试使用检索默认验证错误消息MessageSource 我正在使用的代码使用反射来检索message范围 在不覆盖的约束上message参数 我想检索默认的错误消息 当我调用message验证注释的方法 我得到 org hiberna
  • MS CryptoAPI 无法在 Windows XP 上使用 CryptAcquireContext() 运行

    我使用 Microsoft CryptoAPI 编写了一些代码来计算 SHA 1 并让编译后的 exe 在 Windows 7 Win Server 2008 Win Server 2003 上运行 但是 当我在 Windows XP SP
  • bootstrap-table如何使用搜索和过滤?

    我正在使用 bootstrap 绘制表格 并且需要搜索和过滤功能 但是添加过滤功能后 搜索功能就无法使用了 当我删除 行时 搜索功能起作用 但过滤功能消失 如何使用这两个功能 这是代码 div div table thead tr th I
  • 返回字符串中第 N 个字符之后的字符

    我需要帮助 有人可以让我知道如何返回第 n 个字符之后的字符吗 例如 我的字符串是 001棒球 和 002高尔夫 我希望我的代码返回棒球和高尔夫 而不是数字部分 由于数字后面的单词并不总是相同的长度 我不能使用 Right String n
  • Post 返回 405 方法不允许

    我的 Rails localhost 服务器出现问题 所有 Post 调用开始返回 405 method not allowed 但是我们的临时服务器和生产服务器上没有问题 它发生在所有代码分支上 甚至是那些尚未更新的分支上 调试时 我看到
  • 在执行 ShellExecute 之前等待?

    我有一个希望很快的问题 是否可以稍微延迟 ShellExecute 的执行 我有一个带有自动更新程序的应用程序 下载所有必需的文件等后 它将当前文件重命名为 OLD 并将新文件重命名为以前的文件 够简单的 但随后我需要删除那些 OLD 文件
  • Mockito中的Java枚举列表thenReturn

    有没有办法在mockito的thenReturn函数中枚举列表中的项目 以便我返回列表中的每个项目 到目前为止我已经这样做了 List
  • 如何更改 Flutter DevTools 默认浏览器?

    我可以更改 Flutter DevTools 使用的默认浏览器吗 它与 Firefox 或其他浏览器兼容吗 就我而言 我不太喜欢 Chrome 与 Firefox 和其他浏览器相比 我有点慢且笨重 到目前为止我还没有找到任何解决方案 甚至通
  • Aurelia 取消订阅事件聚合器

    我在用Aurelia Framework with Typescript并在event aggregator我能够发布和订阅频道 问题是我无法取消订阅频道 注意 所有形式的 subscribe 方法都会返回一个 dispose 函数 您可以