【问题标题】:Passing options to JS function with Amber使用 Amber 将选项传递给 JS 函数
【发布时间】:2012-12-02 09:18:53
【问题描述】:

我正在尝试编写相当于:

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

在 Amber smalltalk 中。

我的猜测是:'#draggable' asJQuery draggable: {'axis' -> 'y'} 但事实并非如此。

【问题讨论】:

    标签: smalltalk amber-smalltalk


    【解决方案1】:

    没有在 vanilla 0.9.1 上工作,但至少在最近两个月前在 master 上工作是:

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

    这是推荐的方式。

    P.S.:#{ 'key' -> val. 'key2' -> val }HashedCollection 的内联创建语法,它被实现(来自上述两个月前的修复),因此只有公共(又名可枚举)属性是 HashedCollection 键。在修复之前,所有方法都是可枚举的,这阻止了自然地使用它来代替 JavaScript 对象。

    【讨论】:

    • 酷。有用。这就是我的目标。有趣的是,传递字典不起作用。
    • Dictionary 是更复杂的对象(任何东西都可以是键,而不仅仅是字符串等)。它的实现是为了履行 Smalltalk 合同,但它使用辅助实例变量等来实现这一点; IOW,它的 JavaScript 实现键与其逻辑、语义键不同。 HashedCollection 不是这样 - 它只能将字符串作为键,并且是作为 JavaScript 对象的包装器。
    【解决方案2】:

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

    旧的/替代方法

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

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

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

    第二行将字符串“y”放入槽“axis”中。与以下效果相同:

    options.axis = "y"; // JavaScript
    

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

    数组文字与字典

    您所做的没有奏效,因为在现代 Smalltalk (Pharo/Squeak/Amber) 中,花括号用于数组文字,而不是 JavaScript 中使用的对象文字。

    如果您在工作区中评估(打印)这个:

    { #elelemt1. #element2. #element3 }.
    

    你得到:

    a Array (#elelemt1 #element2 #element3)
    

    因此,如果您有一些 看起来 实际上像 JavaScript 对象字面量的东西,那么它就是一个关联数组。为了说明,我给你这个sn-p,右边是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

    【讨论】:

    • 仅供参考:它不是Dictionary 文字,它是HashedCollection 文字,它是Smalltalk 层次结构中Dictionary 的超类,具有只能字符串可以作为键的限制,并已实现以便它包装一个实际的 JavaScript 对象。
    猜你喜欢
    • 1970-01-01
    • 2021-11-13
    • 2021-01-30
    • 2011-10-25
    • 2013-02-05
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多