2

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 に書き直すにはどうすればよいですか?

試すことの1つは次のとおりです。

(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 でどのように処理できますか?

繰り返しますが、 fullNameonthisfirstName/の依存関係に注意してくださいlastName

4

2 に答える 2

3

これを試して:

(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)))
于 2013-02-04T04:51:55.653 に答える
1

@Ankurの答えをリフすると、次のこともできるようです:

  (deftype AppViewModel [firstName lastName fullName])

  (defn my-model [first last]
    (AppViewModel. 
      (.observable js/ko "Bob") 
      (.observable js/ko "Smith")
      (.computed js/ko (str (firstName) " " (lastName)))))
于 2013-02-06T22:04:36.170 に答える