2016-03-23 54 views
2

我有以下凤凰文件夹结构:呼叫通道从另一个JS连接功能文件

web/ 
    static/ 
    js/ 
     app.js 
     script.js 
     socket.js 

app.js有...

import socket from "./socket" 

import script from "./script" 

brunch-config.js有...

files: { 
    javascripts: { 
     joinTo: "js/app.js" 
    } 
    // ... 
} 

script.js有...

$('#some-button').on('click', function() { 
    connectToChannel(data); 
}); 

socket.js有...

import {Socket} from "phoenix" 

let socket = new Socket("ws://example.com/updates", {params: {"auth-token": "AUTH-TOKEN"}}) 

function connectToChannel(data) { 
    socket.connect() 

    let channel = socket.channel("updates:new", {}) 
    channel.join() 
     .receive("ok", resp => { console.log("Joined successfully", resp) }) 
     .receive("error", resp => { console.log("Unable to join", resp) }) 

    channel.on("update", payload => { 
     console.log(payload); 
    }) 
} 

export default socket 

...然而,当我点击some-button我得到在浏览器的控制台下面的错误:

Uncaught ReferenceError: connectToChannel is not defined

连接成功,如果我把socket.js的内容放在script.js内,但我想保持它们分开。

回答

1

connectToChannel函数对其定义的文件是局部的。api.jsscript.js都不能看到它。

你可以做的是出口从socket.js并将它传递给app.js,这样的事情:在接收功能

// socket.js 

import {Socket} from "phoenix" 

let socket = new Socket("ws://example.com/updates", {params: {"auth-token": "AUTH-TOKEN"}}) 

function connectToChannel(data) { 
    socket.connect() 

    let channel = socket.channel("updates:new", {}) 
    channel.join() 
     .receive("ok", resp => { console.log("Joined successfully", resp) }) 
     .receive("error", resp => { console.log("Unable to join", resp) }) 

    channel.on("update", payload => { 
     console.log(payload); 
    }) 
} 
// export the function too 
export {socket, connectToChannel} 


// app.js 
import {socket, connectToChannel} from "./socket" 

import script from "./script" 

// pass the fn explicitly 
script(connectToChannel); 

最后包装script.jsconnectToChannel

export default function(connectToChannel) { 
    $('#some-button').on('click', function() { 
    connectToChannel(data); 
    }); 
} 
+0

我得到' Uncaught TypeError:(0,_script2.default)不是'app.js'中的一行,它表示'script(connectToChannel);''Uncaught TypeError:connectToChannel不是'I'行的函数' m调用该函数。 – webeno

+0

您是否从'script.js'中导出默认*该函数?你从'socket.js'导出'export {socket,connectToChannel}'吗?你可能错过了一些东西,因为这应该起作用。 我刚刚将这三个文件粘贴到一个空的早午餐应用程序中,它*正在工作。 –

+0

对不起,您在答案中说过我必须* export default * that(which?)函数? – webeno