簡體   English   中英

Coffeescript:無法在其他文件中實例化類的對象

[英]Coffeescript: Unable to instantiate object of a class in different file

在測試中,我無法實例化(我的量角器)代碼中其他文件中存在的類(或調用它們的方法)。 這是我的檔案

輸入咖啡

   class exports.Input

      @element = null

        constructor: (@type, @selector, @identifier) ->
        if @selector is "id"
          @element = element(By.id(@identifier))
        if @selector is "class"
          @element = element(By.css(@identifier))
        console.log @element

      click: ->
        @element.click()

      putText: (inputText) ->
        @element.sendKeys(inputText)  

測試咖啡

describe 'Testing protractor modules', ->
  it 'Testing demo and experimentations', ->
# Initialize all the DOM elements which the suite covers 
    initialize = require('..\\utils\\initialize.coffee').Initialize("https://url.com")    

    inputText = require('..\\utils\\input.coffee').Input("text", "id", "user_email")
    inputPassword = require('..\\utils\\input.coffee').Input("text", "id", "user_password")

    console.log inputText # This is printing undefined
    inputText.putText("analytics@grs.com")
    inputPassword.putText("analytics123")

initialize.coffee

class exports.Initialize
  constructor: (@url) ->
    browser.ignoreSynchronization = true
    browser.get @url
    console.log "Initialize constructor" # This works   

錯誤:無法讀取未定義的屬性。

這里的問題是由於所需的CoffeeScript文件未轉換為JavaScript。 如果您在HTML頁面中包含CoffeeScript編譯器,則它只會在開始時自動編譯<script type="text/coffeescript">元素。

我基本上會停止使用require來包含CoffeeScript文件。

雖然有這么串接各種CoffeeScript的文件合並成一個單一的一個,這里一個實用https://github.com/fairfieldt/coffeescript-concat (引自這個崗位 ,這就是為什么這是一個重復的問題),所以你可以很容易地編譯單個文件轉換為JavaScript。

如果你仍然想類似的東西給require加載你需要為這樣的文件同步或異步HTTP請求的CoffeeScript文件,獲取內容,然后transpile它JS代碼。

不建議使用同步HTTP請求,因此您不能為require做類似的事情,您需要稍后執行回調函數,或者在請求完成之后和CoffeeScript編譯之后執行回調函數。

您還需要使用Functioneval評估編譯的CoffeeScript。 eval在已調用的當前范圍內執行代碼,而Function在全局范圍內執行。

使用異步HTTP請求和eval評估編譯后的CoffeeScript的示例(首先包括CoffeeScript編譯器):

(注意:這個例子不會避免腳本被緩存,這有點寬泛)

function getCoffee(filePath, callback) {
    var request = new XMLHttpRequest;
    request.open('get', filePath, true);

    request.onreadystatechange = function() {
        if (request.readyState === 4) {

            if (request.status === 200) {
                var compiled = CoffeeScript.compile(request.responseText);

                if (typeof callback === 'function') {
                    callback(compiled);
                }
            }
            else {
                /* Handle request error here */
            }
        }
    };

    request.send();
}
getCoffee "script.coffee",
          (compiled) ->
            eval compiled;

注意:我不知道您的require如何工作,因為我不知道Angular.js,因此您可以手動處理導出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM