我試圖在clojurescript包裝knockout.js,但它變得非常困難。我遇到的問題是對「this」變量的引用。我正在考慮放棄,直接使用JavaScript。使用clojurescript包裝knockout.js
我已經採取了關閉的例子和http://knockoutjs.com/examples/helloWorld.htmlhttp://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())
有什麼想法?
如果你能把握住了一個月,我們將開源的Knockout.js啓發,我們一直在使用,在內部實驗室克明計算,觀測庫。請留意我的Github(@lynaghk)。 –
謝謝凱文!我非常期待和圖書館一起玩耍。不過,也有太多的偉大的JavaScript庫,在那裏,有相似類型的宣佈訪問的Clojure沒有其他內部變量的變量的問題。我覺得在js和cljs之間插入一個明確的方法是很重要的。我越用clojurescript安德的JavaScript玩,我越發現不錯的js庫都處於lispy辦法......我只看到了Clojure的學習後的連接。不管怎麼說,希望能得到我的回答您的評論下面 – zcaudate
對http://fluentsoftware.github.com/cljs-binding/一看,不那麼成熟的淘汰賽,但.. – edtsech