我用CoffeeScript编写了这个类:
Notification.js.coffee
class Notification
display: ->
@dom.show()
constructor: (header, messages) ->
@render(header, messages)
基本上,render()
函数代码的逻辑是将HTML注入DOM(但隐藏)和display()
方法只是shows
DOM元素。现在,我有一些其他类与这个类别分开,我正在尝试使用上面的类。
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
我到底错过了什么?
答案 0 :(得分:0)
你遗漏了几件事:
Notification
中的SharerController
与您在Notification
中定义的Notification.js.coffee
不同。我认为您正在使用Chrome的原生Notification
并且没有display
方法。@dom
中没有Notification
,因此如果您设法调用它,display
来电将会失败。render
中没有Notification
方法,因此您的Notification
构造函数会因@render
调用而失败。如果您只包含Notification
代码的样本,则(2)和(3)不是真正的问题。
CoffeeScript将生成的JavaScript包装在一个自执行的函数中,如下所示:
(function() {
// JavaScript goes here...
}).call(this);
因此,您的Notification
文件无法显示Notification.js.coffee
。您可以通过说:
class window.Notification
#...
或
class @Notification
#...
或者您可以使用自己的命名空间as in this other question。
将Notification
提供给应用程序的其余部分后,您可以实例化自己的Notification
,解决其他问题,最后您将调用display
具有display
方法的东西。