通过Amber向JS函数传递选项

5

我想要写出以下代码的等效版本:

$( "#draggable" ).draggable({ axis: "y" });

在Amber smalltalk中。

我的猜测是:'#draggable' asJQuery draggable: {'axis' -> 'y'} 但这并不正确。

2个回答

5

在Vanilla 0.9.1上无法工作,但至少在最近两个月的主分支上可以工作,方法是:

'#draggable' asJQuery draggable: #{'axis' -> 'y'}

据我所知,这是推荐的方法。

P.S.: #{ 'key' -> val. 'key2' -> val } 是内联创建HashedCollection的语法,该语法已实现(从前面提到的两个月前的修复中),只有公共(可枚举)属性是HashedCollection键。在修复之前,所有方法都是可枚举的,这阻止了在JavaScript对象的位置自然使用它。


很好,它可以工作。这正是我想要的。有趣的是传递一个字典不起作用。 - milan
“Dictionary” 是一个更为复杂的对象(任何东西都可以作为键,而不仅仅是字符串等)。它被实现以满足 Smalltalk 的合同,但它使用了辅助实例变量等来实现这一点;换句话说,它的 JavaScript 实现键与其逻辑、语义键不同。而对于 “HashedCollection” 来说则不然——它只能有字符串作为键,并且旨在作为 JavaScript 对象的包装器。 - user1046334

2

herby的优秀回答指出了推荐的方法。显然,现在有字典文字支持(请参见他下面的评论)。我不知道那个 :-)

旧的/替代的方法

由于历史原因,或者用户没有使用最新的主版本,这是一种替代方法:

options :=  <{}>. 
options at: #axis put: 'y'.
'#draggable' asJQuery draggable: options.

第一行创建了一个空的JavaScript对象(实际上是一个JSObjectProxy)。

第二行将字符串“y”放入插槽“axis”中。它具有与以下代码相同的效果:

options.axis = "y"; // JavaScript

最后,它被调用并作为参数传递。

数组字面量 vs 字典

你之前所做的不起作用,因为在现代 Smalltalk(Pharo/Squeak/Amber)中,花括号用于表示数组字面量,而不是像在 JavaScript 中一样用于对象字面量。

如果你在 Workspace 中评估(print-it)这段代码:

{ #elelemt1. #element2. #element3 }.

您将获得:

a Array (#elelemt1 #element2 #element3)

因此,如果你有一个看起来像JavaScript对象字面量的东西,实际上它是一个关联数组。为了说明这一点,我给你提供了以下代码片段,并在右侧列出了print-it的结果:

arrayLookingLikeObject := { #key1 -> #value1. #key2 -> #value2. #key3 -> #value3}.

arrayLookingLikeObject class. "==> Array"
arrayLookingLikeObject first class. "==> Association"
arrayLookingLikeObject "==> a Array (a Association a Association a Association)" 

我在这里写了关于它的内容: http://smalltalkreloaded.blogspot.co.at/2012/04/javascript-objects-back-and-forth.html

1
请注意:这不是一个“Dictionary”字面量,而是Smalltalk层次结构中的“HashedCollection”字面量,它是“Dictionary”的超类,具有仅允许字符串作为键的限制,并且实现方式是将其包装在一个实际的JavaScript对象中。 - user1046334

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接