javascript - Ember 发生错误 : Assertion Failed: on called without valid event names

标签 javascript ember.js dom-events ember.js-2

我的 ember 2.18 应用程序中有一个 Controller ,我想让它监听应用程序中某处触发的某些事件 myEventName,以更改模型属性。

根据the API docs for this version捕获发出事件的方法如下:

import Evented from '@ember/object/evented';
import Controller from '@ember/controller';
// extend some object, like a Controller
const myExtendedObject = Controller.extend(Evented, { 
    // stuff ...
     });

myExtendedObject.on('myEventName', function (args) {  
    console.log("catch importDone  ok", args); 
    });
export default myExtendedObject;

代码可以使用 ember build dev 很好地编译, 但在浏览器的 JS 控制台中我收到此错误消息:

Error: Assertion Failed: on called without valid event names error.js:40

我尝试重命名事件,但找不到事件名称错误的原因。 我还尝试为 on 方法设置三个参数,但事件名称仍然存在问题。 我错过了什么?

编辑:
我做了一个 Ember 旋转,显示事件的范围仅限于组件。 我想从任何地方捕获他们; 就像从服务触发事件并在路由中捕获它一样。

https://ember-twiddle.com/ce22cc0a542e8e0997a1ad57a4a9688c?fullScreen=true

最佳答案

你可以像这样使用它:

import { on } from '@ember/object/evented';

export default Controller.extend(Evented, {
  init() {
    this._super(...arguments);
    this.trigger('greet');
  },

  myGreetImplementation: on('greet', function() {
    console.log('hello');
  })
});

另一个示例:使用服务来管理用户设置并订阅更改:

export default Service.extend(Evented, {
  ...
  changeProfilePicture() {
    ...
    this.trigger('profilePictureChanged', ... event parameters ...);
  }
});

然后您可以使用 on 方法在任何地方监视此类事件:

 export default Controller.extend({
  userSettings: service(),

  init() {
    this._super(...arguments);
    this.get('userSettings').on('profilePictureChanged', this, this.profilePictureChanged);
  },

  profilePictureChanged(... event parameters ...) {
   ...
  }
});

您收到的错误来自这里: https://github.com/emberjs/ember.js/blob/6fc89cdf13124d88b8ae6adf99bb02a8c0cdf508/packages/ember-metal/lib/events.ts#L211 (您可以将错误消息粘贴到 github 搜索中,或者使用调试器来查找有关失败原因的更多信息)

<小时/>

更新:扩展您的操作以使 Controller 在服务的事件上注册:

import Ember from 'ember';
import { inject as service } from '@ember/service';
import { on } from '@ember/object/evented';

export default Ember.Controller.extend({
  appName: 'Ember Twiddle',
  myService: service(),
  init() {
    this._super(...arguments);
    this.get('myService').on('mycall', this, this.mycallHandler);
  },
  mycallHandler: on('mycall', function() {
    console.log('here we are');
  })
});

关于javascript - Ember 发生错误 : Assertion Failed: on called without valid event names,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51927064/

相关文章:

ember.js - 使用 ember JS 转义 CSS 字符串不起作用

javascript - 使用固定装置的 Ember.js/Rails 集成测试

javascript - Ember 计算属性不适用于服务器数据

javascript - 动态加载脚本后访问变量

javascript - 抓取附加到 div 元素的 css 属性

javascript - 使用 JavaScript 模拟 Tab 按键

对象字面量与函数相比 Javascript 性能提升

javascript - 如何在使用 Paperclip 上传图像时发出通知

javascript - 如何将 keyup 事件附加到自定义元素shadowRoot

javascript - 接线元件事件