2015-11-02 2 views
0

Является ли этот документ устаревшим? http://www.scala-js.org/doc/calling-javascript.html Не похоже, чтобы получить это право в IntelliJ:Вызов jquery .each метод из scala.js

import org.scalajs.dom.html 
import org.scalajs.dom 
import org.scalajs.dom.raw.HTMLElement 
import scala.scalajs.js 
import js.JSConverters._ 

import fr.iscpif.scaladget.d3._ 
import fr.iscpif.scaladget.mapping._ 

import scala.scalajs.js 
import scala.scalajs.js.annotation.JSExport 
import org.scalajs.jquery.jQuery 

/** 
* Created by IDEA on 31/10/15. 
*/ 
@JSExport 
object LearnD3 { 
    @JSExport 
    def main(div: html.Div): Unit = { 
    jQuery("#list > li").each((x, y) => y) 
    } 
} 

Первый dom.HTMLElement, кажется, не существует. Существует org.scalajs.dom.raw.HTMLElement, но даже если я импортировать, что существует несоответствие типов:

enter image description here

+0

Может вы предоставляете полный пример (импорт тоже?) –

+0

Конечно. Вопрос отредактирован. – qed

ответ

4

Необходимо указать типы параметров. Следующий код работает:

val x = jQuery("#list > li").each((i: js.Any, y: Element) => y) 

Вы можете отметить, что индекс i относится к типу Any и, как правило, вы бы ожидать, что индекс будет типа Int. Из-за таких проблем родилось jquery-facade: более строго типизированный фасад для jquery. Я очень рекомендую. Тот же самый код в Jquery-фасада:

import org.querki.jquery._ 

... 

val x = $("#list > li").each((y: Element, i: Int) => y) 

Или, если вам не нужен i индекс:

val x = $("#list > li").each((y: Element) => y) 

Или вы хотите y типа быть infered:

val x = $("#list > li").foreach(y => y) 
+0

Обратите внимание, что этот пример был одной из причин, по которым я создал jquery-facade, так как я использую each() много. каждый() работает там несколько интуитивно, а методы расширения mapElems() и foreach() лучше всего работают с кодом Scala. (См. Https://github.com/jducoeur/jquery-facade/blob/master/src/main/scala/org/querki/jquery/JQueryExtensions.scala) –

+0

Я собирался обновить ответ с помощью примера JQuery-facade:) –

+0

'foreach' похоже работает. Не два других: https://www.evernote.com/l/ATH1SCHGKB9FPYY76pia0A_APqk9zx6oaaoB/image.png – qed

2

На самом деле, это всегда просто намеревался стать концептуальным примером того, как использовать ThisFunction - это никогда на самом деле было правильным для свободно напечатанный scala-js-jquery facade. (Это ближе к the jquery-facade version, хотя на тот момент, когда по-прежнему требуется элемент Element, а не HTMLElement, так как это говорит JQuery. Я должен подумать, нужно ли это ужесточить, я честно не уверен.)

Но в принципе, это никогда не предназначалось для буквенного кода, и я считаю, что он никогда не работал как таковой. Это всего лишь иллюстрация синтаксиса ThisFunction.

Что касается HTMLElement, да, это сейчас под raw. Вы обычно ссылаетесь на это как dom.html.Element. В этом отношении он - устарел. Но, несмотря на это, пример следует рассматривать скорее как концепцию, чем буквальный код. (И да, пример может использовать переписывание, как правило, с радостью принимаются PR).

+0

Я хотел бы внести свой вклад, но я должен понять, как работает javascript-вызов в scala.js. :-) – qed

+0

Требуется немного практики, а обратные вызовы функции - это глубокий конец пула. Но вы можете попробовать сравнить сигнатуры функций в jquery-facade с документацией JavaScript jQuery, чтобы хотя бы понять, как * I * подходит к переводу ... –

+0

Ok. Я также заметил, что на фасадах scala.js часто нет тестовых файлов, почему? – qed

Смежные вопросы