How can I translate the following jquery code to Dart? I'm having difficulty getting the alert callback to work using js.interop.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script>
$(function () {
$('p').hide('slow', function() {
alert("The paragraph is now hidden");
});
});
</script>
Any help is appreciated.
thanks for your question! I wasn't sure myself, but turns out this is possible. :)
First off, add js
to your pubspec.yaml:
name: jquerydart
description: A sample application
dependencies:
js: any
Then, run pub install, either via the command line or via Dart Editor.
Then, in your Dart file:
import 'dart:html';
import 'package:js/js.dart' as js;
hideIsDone() {
window.alert('all done!');
}
void main() {
js.scoped(() {
js.context.jQuery('p').hide(1000, new js.Callback.once(() => hideIsDone()));
});
}
Note that to callback from JS into Dart, you need to create a Callback object.
Also note you cannot use $
for the jQuery variable, as dart2js also uses $
. So in the meantime you need to use jQuery
in your Dart code.
Having said all that, it's cool that we can use jQuery via JS-Dart interop, but Dart should really do this for us. So I opened bug http://code.google.com/p/dart/issues/detail?id=6526
First add the js
dependency to your pubspec.yaml :
dependencies:
js: any
By using js-interop you can write almost the same code as in javascript.
import 'dart:html';
import 'package:js/js.dart' as js;
void main() {
js.scoped(() {
js.context.$(new js.Callback.once(($) {
$('p').hide('slow', new js.Callback.once(() {
js.context.alert("The paragraph is now hidden");
}));
}));
});
}
The main differences are :
js.Callback.once
or js.Callback.many
to set your callback functions. Use js.Callback.once
if your callback is call only one time.js.scoped
. Basically, managing proxy lifetimes is here to prevent memory leak.That said, you can simplify the above code :
import 'dart:html';
import 'package:js/js.dart' as js;
void main() {
js.scoped(() {
js.context.$('p').hide('slow', new js.Callback.once(() {
window.alert("The paragraph is now hidden");
}));
});
}
The changes are :
js.context.$(new js.Callback.once(($) {
isn't needed because main
is equivalent to the jQuery $(function)
.js.context.alert
has been replace by window.alert
: it's more efficient to directly use DART functions instead of communicate with JS.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With