0

我有这个用 CoffeeScript 编写的课程:

Notification.js.coffee

class Notification

  display: ->
    @dom.show()

  constructor: (header, messages) ->
    @render(header, messages)

基本上,render()函数代码的逻辑是将 HTML 注入到 DOM(但隐藏)和display()方法只是showsDOM 元素。现在,我有一些其他类与这个类分开,我正在尝试使用上面的类。

SharerController.js.coffee

class SharerController

  post_story: ->
    # some user action posting something in the app
    notification = new Notification('Header', ['This story has been posted.', 'You can post more. Would you like to?'])
    notification.display()

不幸的是,出于某种原因 - 我明白了

TypeError: 'undefined' is not a function (evaluating 'notification.display()')

在上面我做的那一行notification.display()。如果我在 Notification 类中编写相同的代码(所有内容都被包装到 IIFE 中),则相同的代码绝对可以正常工作。上述文件的加载顺序是:Notification.js 和 SharerController.js

我到底在这里想念什么?

4

1 回答 1

0

你错过了几件事:

  1. Notificationin yourSharerControllerNotification您在 in 中定义的不同Notification.js.coffee。我认为您正在使用 Chrome 的本机Notification并且没有display方法。
  2. 你没有@domNotification所以display如果你设法调用它,你的调用将失败。
  3. 您的方法中没有任何render方法,Notification因此您的Notification构造函数将因@render调用而失败。

如果您只包含Notification代码示例,那么 (2) 和 (3) 并不是真正的问题。

CoffeeScript 将生成的 JavaScript 包装在一个自执行函数中,如下所示:

(function() {
  // JavaScript goes here...
}).call(this);

所以你在你的文件Notification之外是不可见的。Notification.js.coffee您可以通过以下方式使其全局可见:

class window.Notification
  #...

或者

class @Notification
  #...

或者您可以像在其他问题中一样使用自己的名称空间。

一旦你让你Notification的应用程序的其余部分可用,你就可以实例化你自己的Notification,解决你的其他问题,最后你会调用display一些有display方法的东西。

于 2012-11-19T04:37:05.623 回答