2014-09-01 36 views
0

設置簡單:ExternalJSEnv沒有看到發射器,網頁中的JavaScript依賴

lazy val root = project.in(file(".")) 
    .settings(scalaJSSettings: _*) 
    .settings(utestJsSettings: _*) 
    .settings(persistLauncher := true) 
    .settings(persistLauncher in Test := false) 
    .settings(
    name := "bindings", 
    version := "0.0.1-SNAPSHOT", 
    scalaVersion := "2.11.2", 
    libraryDependencies ++= Seq(
    "org.scala-lang.modules.scalajs" %%% "scalajs-dom" % "0.6", 
    "com.lihaoyi" %%% "utest" % "0.2.3" % "test" 
), 
    jsDependencies += "org.webjars" % "d3js" % "3.4.11"/"d3.js", //d3.min.js 
    autoCompilerPlugins := true, 
    test in Test := (test in(Test, fastOptStage)).value, 
    requiresDOM := true, 
    traceLevel := 0 
) 

phantomjs-發射-webpage.html包含真的是超級有效的東西:現在

<script type="text/javascript" src="/path/scalajs-bindings/target/scala-2.11/classes/d3.js"></script> 
<script type="text/javascript" src="/path/scalajs-bindings/target/scala-2.11/bindings-fastopt.js"></script> 
<script type="text/javascript"> 
// Phantom.js code launcher 
// Origin: /path/scalajs-bindings/target/scala-2.11/bindings-launcher.js 
window.addEventListener('load', function() { 
((typeof global === "object" && global && 
     global["Object"] === Object) ? global : this)["com"]["whatever"]["scalajs"]["Appp"]().main(); 
}, false); 
</script> 

,在瀏覽器中它可以打電話D3,我試圖與對應的HTML,但使用PhantomJS或者如果的NodeJS我做的fastOptStage::runfastOptStage::test我得到

TypeError: undefined is not an object (evaluating 'd3["scale"]')

的代碼看起來是這樣的:

object Appp extends JSApp { 
    override def main(): Unit = { 
    val fill = d3.scale.category20() 
    println(fill) 
    } 
} 
+0

我正在調查此問題。快點:你可以在'Appp'中添加'd3'的定義嗎? – gzm0 2014-09-01 12:49:15

+0

你有沒有在自己的classpath上使用'd3.js'? jsDependency解析僅在一個按文件名的基礎上執行。看起來你沒有從jar中獲得'd3.js'。如果您取消註釋'd3.min.js',它會起作用嗎? – gzm0 2014-09-01 12:54:50

+0

將d3對象添加到Appp - >'TypeError:undefined不是一個對象(評估'ScalaJS.g [「Appp $ d3」] [「scale」]')'...我在src/main中有d3.js/resources' ...它實際存在於'target/scala-2.11/classes/d3.js'中...我嘗試取消註釋'd3.min.js' ...我用'd3.min.js '也是 - 它也行不通... ... btw它與jQuery的工作,雖然,如果我添加到jsDependencies jQuery的,它只是工作 – lisak 2014-09-01 13:06:59

回答

2

你可以有你的對象d3擴展js.GlobalScope,它將在全局JavaScript範圍中查找(即其中d3.js會把它):

object Appp extends JSApp { 
    object d3 extends js.GlobalScope { 
    def scale: js.Dynamic = ??? 
    } 
    override def main(): Unit = { 
    val fill = d3.scale.category20() 
    println(fill) 
    } 
} 

然而,在d3的情況下,你可能要考慮具有d3包對象本身延伸js.GlobalScope

package mbostock 

package object d3 extends js.GlobalScope { 
    def scale: js.Dynamic = ??? 
} 

我強烈建議你閱讀JavaScript interoperability guide,特別是關於calling JavaScript from Scala.js的部分。

0

它不工作了,我有一個包對象D3對象的原因:

package object mbostock { 

object d3 {...} 

} 

它也不會作爲工作內部類:

object Appp extends JSApp { 
    object d3 {...} 
    override def main(): Unit = {...} 
}