【发布时间】:2012-06-04 06:30:00
【问题描述】:
我正在尝试将 knockout.js 包装在 clojurescript 中,但它变得非常困难。我遇到的问题是对“this”变量的引用。我正在考虑放弃并直接使用javascript。
我以http://knockoutjs.com/examples/helloWorld.html 和http://knockoutjs.com/examples/contactsEditor.html 为例
我已经设法用一些宏来包装简单的函数。例如:
var ViewModel = function() {
this.firstName = ko.observable("Bert");
this.lastName = ko.observable("Bertington");
this.fullName = ko.computed(function() {
// Knockout tracks dependencies automatically. It knows that fullName depends on firstName and lastName, because these get called when evaluating fullName.
return this.firstName() + " " + this.lastName();
}, this);
};
变成:
(defviewmodel data
(observing :first_name "Bert")
(observing :last_name "Bertington")
(computing :name [:first_name :last_name]
(str :first_name " " :last_name)))
但是,对于更难的事情,例如:
var BetterListModel = function () {
this.itemToAdd = ko.observable("");
this.allItems = ko.observableArray(["Fries", "Eggs Benedict", "Ham", "Cheese"]); // Initial items
this.selectedItems = ko.observableArray(["Ham"]); // Initial selection
this.addItem = function () {
if ((this.itemToAdd() != "") && (this.allItems.indexOf(this.itemToAdd()) < 0)) // Prevent blanks and duplicates
this.allItems.push(this.itemToAdd());
this.itemToAdd(""); // Clear the text box
};
this.removeSelected = function () {
this.allItems.removeAll(this.selectedItems());
this.selectedItems([]); // Clear selection
};
this.sortItems = function() {
this.allItems.sort();
};
};
ko.applyBindings(new BetterListModel());
我不确定我可以在 clojurescript 中做什么来匹配这样的代码:this.allItems.push(this.itemToAdd())
有什么想法吗?
【问题讨论】:
-
如果你能坚持一个月,我们将开源我们在 Keming Labs 内部使用的受 Knockout.js 启发的计算可观察库。关注我的 Github (@lynaghk)。
-
谢谢凯文!我真的很期待和图书馆一起玩。但是,有太多优秀的 javascript 库存在类似类型的问题,即声明访问 clojure 没有的其他内部变量的变量。我觉得在 js 和 cljs 之间有一种清晰的插值方式很重要。我玩clojurescript ande javascript的次数越多,我就越发现好的js库是以一种lispy的方式......我在学习clojure之后才看到这种联系。无论如何,希望在下面我的回答中得到您的 cmets
-
看看fluentsoftware.github.com/cljs-binding,没有Knockout那么成熟,但是..
标签: clojure knockout.js clojurescript