代码之家  ›  专栏  ›  技术社区  ›  Ty Kayn

错误时发生成员事件:断言失败:调用时没有有效的事件名称

  •  0
  • Ty Kayn  · 技术社区  · 6 年前

    我的ember 2.18应用程序中有一个控制器,我想让它监听应用程序中某个地方触发的事件“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;
    

    但在浏览器的JS控制台中,我得到了一条错误消息:

    错误:断言失败:调用时没有有效的事件名错误。js:40

    我尝试重命名事件,但找不到事件名称错误的原因。 我错过了什么?

    我做了一个灰烬旋转显示,事件的范围是组件。 我想从任何地方抓住他们。

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   enspandi    6 年前

    你可以这样使用它:

    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搜索中粘贴错误消息,或者使用调试器了解有关失败原因的更多信息)


    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');
      })
    });
    
    推荐文章