这是用于 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.observable
,每个字段ko.computed
都返回一个函数。还要注意这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.computed
. 也就是说,它编译为:
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 中处理它?
再次注意fullName
onthis
和firstName
/的依赖关系lastName
。