0

私はこのクラスを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()。通知クラス(すべてがIIFEにラップされる)内に記述した場合、同じコードが完全に期待どおりに機能します。上記のファイルのロード順序は、Notification.js、次にSharerController.jsです。

私はここで何が欠けていますか?

4

1 に答える 1

0

あなたはいくつかのことを見逃しています:

  1. Notificationは、で定義しているSharerControllerのと同じではありません。あなたはChromeのネイティブを手に入れていると思いますが、それには方法がありません。NotificationNotification.js.coffeeNotificationdisplay
  2. あなたの中にはないので@dom、あなたがそれを呼び出すことができた場合、あなたの呼び出しは失敗します。Notificationdisplay
  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呼び出すことができます。displaydisplay

于 2012-11-19T04:37:05.623 に答える