3

ノックアウト es5 で否定されたブールセッターを使用しようとしていますが、toggleViewModel関数を使用した変更はビューに反映されません。

私が使用するself.showViewModelData(!self.showViewModelData())と、期待どおりに動作します。デバッガーでは、ビューモデルで値が実際に正しく設定されていることがわかります。これにより、何らかの理由でプロパティの設定が正しく機能しないと思います。

私がここに欠けているものはありますか?

var vm = (function(){
  var self = this;

  self.showViewModelData = ko.observable(false);

  self.toggleViewModel = function(){
    self.showViewModelData = !self.showViewModelData;
  }

  var vm = {
    toggleViewModel: self.toggleViewModel,
    showViewModelData: self.showViewModelData
  }

  ko.track(vm);
  return vm;
})();
ko.applyBindings(vm);
4

1 に答える 1

0

問題は、明らかにするモジュール パターンを正しく使用していないことです (コンストラクター パターン (デモJSFiddleself )を使用するときに使用されるすべてのものをハングアップしようとしています):

var vm = (function(){
  //this will be the global (window) object
  var self = this;

  self.showViewModelData = ko.observable(false);

  self.toggleViewModel = function(){
    //when exectued "self" will be the global (window) object 
    //but you have bound to vm so you are setting the wrong property here
    self.showViewModelData = !self.showViewModelData;
  }

  //this object gets bound by KO 
  var vm = {
    toggleViewModel: self.toggleViewModel,
    showViewModelData: self.showViewModelData
  }

  ko.track(vm);
  return vm;
})();

正しい使用法は次のとおりです。代わりにself、フィールドと関数をローカルで定義する必要がありますvar

var vm = (function(){

  var showViewModelData = ko.observable(false);

  var toggleViewModel = function(){
      this.showViewModelData = !this.showViewModelData;
  }

  var vm = {
    toggleViewModel: toggleViewModel,
    showViewModelData: showViewModelData
  }

  ko.track(vm);
  return vm;
})();

JSFiddleのデモ。

しかし、Knockout-ES5 プラグインを使用することの要点は、監視可能なプロパティを明示的に宣言しないことです。したがってshowViewModelData、通常のプロパティとして宣言するだけで、正常に動作するはずです。

于 2013-09-05T15:06:59.257 に答える