使用ko.js将预定义状态绑定到复选框

时间:2019-04-15 21:28:36

标签: javascript jquery checkbox knockout.js

我想使用kickout.js将预定义状态应用于复选框 我已经尝试了很多东西,但是无法正常工作。

这是我的代码:

function DemoItem(id, name, state) {
  var self = this;

  self.id = ko.observable(id);
  self.Name = ko.observable(name);
  self.Selected = ko.observable(state);
}

function ViewModel() {
  var self = this;

  self.availableItems = ko.observableArray([]);


  self.init = function() {
    self.availableItems.push(new DemoItem(1, 'One', true));
    self.availableItems.push(new DemoItem(2, 'Two', true));
    self.availableItems.push(new DemoItem(3, 'Three', false));
    self.availableItems.push(new DemoItem(4, 'Four', true));
    self.availableItems.push(new DemoItem(5, 'Five', true));
  };

  self.relayState = ko.computed({
    read: function() {
      ko.utils.arrayForEach(self.availableItems, function(item) {
        return item.Selected();
      });

    },
    write: function(value) {
      if (value) {
        console.log("associate item ");
      } else {
        console.log("disasociate item ");
      }
    }
  })
}

var viewModel = new ViewModel();
ko.applyBindings(viewModel);
viewModel.init();
Available Items:
<div data-bind="foreach: $root.availableItems">
  <input type="checkbox" data-bind="value: id(), checked: $root.relayState" />
  <span data-bind="text: '&nbsp;' + Name()"></span>
  <br/>
</div>

我无法获得复选框以最初应用预定义的值。

这是JSfiddle的链接:http://jsfiddle.net/w392rpxf/

1 个答案:

答案 0 :(得分:0)

我不确定您要做什么,但这听起来像敲除的常规绑定应该可以解决。

您可以创建一个保存选择的observableArray。 (取消)选中任何复选框会自动在此数组中添加或删除一个项目。

Selected上的DemoItem属性仅用于在init函数中填充其初始状态。

function DemoItem(id, name, state) {
  var self = this;

  self.id = ko.observable(id);
  self.Name = ko.observable(name);
  self.Selected = ko.observable(state);
}

function ViewModel() {
  var self = this;

  self.availableItems = ko.observableArray([]);
  self.selectedItems = ko.observableArray([]);

  // Log changes to the console
  self.selectedItems.subscribe(function(sel) {
    console.log("Selected are: " + sel.map(function(s) {
      return s.Name();
    }).join(", "));
  });

  self.init = function() {
    self.availableItems([
      new DemoItem(1, 'One', true),
      new DemoItem(2, 'Two', true),
      new DemoItem(3, 'Three', false),
      new DemoItem(4, 'Four', true),
      new DemoItem(5, 'Five', true)
    ]);
    
    // Set up the initial state
    self.selectedItems(
      self.availableItems()
        .filter(function(item) {
          return item.Selected();
        })
    );
  };
  
  

}

var viewModel = new ViewModel();
ko.applyBindings(viewModel);
viewModel.init();
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
Available Items:
<div data-bind="foreach: $root.availableItems">
  <input type="checkbox" data-bind="checked: $root.selectedItems, checkedValue: $data" />
  <span data-bind="text: '&nbsp;' + Name()"></span>
  <br/>
</div>

编辑:由于您想知道哪个已更改,因此这是另一个示例:

function DemoItem(id, name, state, onChange) {
  var self = this;

  self.id = ko.observable(id);
  self.Name = ko.observable(name);
  self.Selected = ko.observable(state);
  
  self.Selected.subscribe(function(newValue) {
    onChange(self, newValue);
  });
}

function ViewModel() {
  var self = this;

  self.availableItems = ko.observableArray([]);
  self.selectedItems = ko.pureComputed(function() {
    return self.availableItems().filter(function(demoItem) {
      return demoItem.Selected();
    });
  });

  // Log changes to the console
  self.selectedItems.subscribe(function(sel) {
    console.log("Selected are: " + sel.map(function(s) {
      return s.Name();
    }).join(", "));
  });
  
  // Log the individual that caused the change
  self.onItemChange = function(item, newValue) {
    console.log("The item that changed was " + item.Name() + " (" + newValue + ")");
  };

  self.init = function() {
    self.availableItems([
      new DemoItem(1, 'One', true, self.onItemChange),
      new DemoItem(2, 'Two', true, self.onItemChange),
      new DemoItem(3, 'Three', false, self.onItemChange),
      new DemoItem(4, 'Four', true, self.onItemChange),
      new DemoItem(5, 'Five', true, self.onItemChange)
    ]);
  };
}

var viewModel = new ViewModel();
ko.applyBindings(viewModel);
viewModel.init();
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
Available Items:
<div data-bind="foreach: $root.availableItems">
  <input type="checkbox" data-bind="checked: Selected" />
  <span data-bind="text: '&nbsp;' + Name()"></span>
  <br/>
</div>