1

私はCSのクラスを持っています:

class Model
  constructor: (objectParams) ->
    @object = ##object
    ###constructor

  baseObject: => {}
  validate: ko.computed =>
    console.log ko.toJS @object

問題は 'validate' にあります。これは、ko.computed 関数のバインド コンテキストがコンストラクターである必要があるプロトタイプ プロパティですが、代わりにこれにコンパイルされます。

Model.prototype.validate = ko.computed(function() {
  return console.log(ko.toJS(Model.object));
});

コンストラクターにバインドしたいのですが、太い矢印 => はこの方法でしか機能していないようです:

property: () =>

そして、この方法では機能しません

  validate: =>
    ko.computed => console.log ko.toJS @object

ko.computed は関数内で定義できないため

どうすれば解決できますか?

4

3 に答える 3

1

robkuzは問題を正しく特定したと思います。validate解決策は、コンストラクター内でプロパティを設定することです。

class Model
  constructor: (objectParams) ->
    @object = ##object

    @validate = ko.computed =>
      console.log ko.toJS @object
于 2012-11-01T14:56:58.683 に答える
1

関数をインスタンスにバインドして「前処理」すると、次のように機能します

pipe = (fn)->
    return ->
        fn.apply(@, arguments)


class A
    foo: pipe -> @bar()
    bar: -> ...

パイプ関数 (あなたの場合は ko.computed) から、最初の関数をラップして .apply 経由で呼び出す別の関数を返します。

あなたが@で適用を呼び出しているので、太い矢印は必要ありません

于 2012-11-02T05:49:32.290 に答える
0

関数をクラス (プロトタイプ) に関連付ける前に関数を「アドバイス」すると、太い矢印を使用した場合に通常発生するインスタンスへのバインディングは発生しません。

class A
    foo: advise => @someMethod()

中間のアドバイス機能は、CS コンパイラを切断して、何をしたいのかが明確にならないようにし、呼び出しがないようにします。

this.foo = __bind(this.foo, this); 

コンストラクターで。

ただし、メソッド定義内で「アドバイス」関数を使用すると、CS がクロージャーを作成し、インスタンスにアクセスできるようになります。

class A
    foo: ->
         advise => @someMethod()

これにより生成されます

A.prototype.foo = function() {
    var _this = this;
    return advise(function() {
       return _this.someMethod();
    });
};

ここで重要なのは「var _this = this;」の定義です。これは、インライン関数定義内で使用されます。

お役に立てれば。

于 2012-11-01T12:41:36.360 に答える