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 回答