clojure - ClojureScript 中函数调用结果的方法定义

标签 clojure clojurescript

这是 Knockout 的 JS 示例:

function AppViewModel() {
    this.firstName = ko.observable('Bob');
    this.lastName = ko.observable('Smith');
    this.fullName = ko.computed(function() {
        return this.firstName() + " " + this.lastName();
    }, this);
}

如果您不熟悉 KO,AppViewModel 上的每个字段都会变成一个函数(即 ko.observableko.compulated 各一个)返回一个函数。另请注意,fullName 取决于这两个函数。

如何将其重写为 ClojureScript?

要尝试的一件事是:

(deftype AppViewModel [firstName lastName]
  Object
  (fullName [this] (.computed js/ko (str (firstName) " " (lastName)))))

(defn my-model [first last]
  (AppViewModel. 
    (.observable js/ko "Bob") 
    (.observable js/ko "Smith")))

但是它不起作用,因为 fullName 变成了一个调用 ko.compulated 的函数。也就是说,它编译为:

my_namespace.AppViewModel.prototype.fullName = function() {
  return ko.computed([cljs.core.str(this.firstName.call(null)), cljs.core.str(" "), cljs.core.str(this.lastName.call(null))].join(""))
};

我该如何在 ClojureScript 中处理它?<​​/p>

再次注意 fullNamethisfirstName/lastName 的依赖性。

最佳答案

试试这个:

(defn my-model [first last]
  (let [fname (.observable js/ko first)
        lname (.observable js/ko last)
        full-name (.computed js/ko #(str (fname) " " (lname)))] 
        (js-obj "firstName" fname
                "lastName" lname
                "fullName" full-name)))

关于clojure - ClojureScript 中函数调用结果的方法定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14677098/

相关文章:

loops - 无法通过逐个元素循环来更新向量

Clojure 的 :require and Instaparse

unit-testing - 如何将测试映射到数字列表

Clojurescript 数组映射顺序

javascript - JavaScript 对象的 ClojureScript 深度相等

clojurescript - 在 clojurescript/试剂/reagi 中跟踪鼠标?

http - get 请求中的零内容长度从 lighttpd (clj-http) 获取 400 Bad Request

javascript - 将 javascript 翻译为 Clojurescript

reactjs - 在 ClojureScript 中,如何正确使用 cljsjs/react-mdl?

xml - 使用 dtd 时 clojure xml 解析缓慢