1

我正在寻找修改网络应用程序中的一些现有文本,我正在使用如下表达式访问这些文本:

(.-innerHTML (.getElementById js/document "myElementId"))

我特别想做的是通过搜索/替换来改变该文本:

(set! (^that whole thing) (.replace (^that whole thing) "old" "new"))

理想情况下,我希望这样做而不必重复属性访问表达式。是否有任何现有的快捷方式?我正在设想类似 Raku 的object .= method(args)简写形式object = object.method(args);也许一个好的 clj 名称/模式是(.set! (access-expression) method & args). 我总是可以写一个宏,但想知道我是否忽略了一些已经存在的东西。

4

1 回答 1

1

我也很好奇,查看了CLJS CheatSheet,它们链接到CLJS Oops库,该库提供了类似的功能。

似乎最强大的解决方案是仅依赖 Google Closure Library(它总是在手边)并使用 and 的组合goog.object/getgoog.object/set不需要宏),例如:


(require 'goog.object)

(defn update-obj! [obj field f & args]
  (let [old-val (goog.object/get obj field)
        new-val (apply f old-val args)]
    (goog.object/set obj field new-val)))

;; Example:
(update-obj! (.getElementById js/document "my-div") "innerHTML" (partial str "it works: "))

这应该适用于开发和优化输出。

于 2021-06-30T04:42:57.303 回答