【问题标题】:How to can I create an array of knockout.js observables?如何创建一系列 knockout.js 可观察对象?
【发布时间】:2017-11-27 13:59:32
【问题描述】:

我有一组对象,我正在显示它们的属性。 如何向它们添加单独的编辑功能?可以说它是列表中每个元素的编辑按钮。

我想在对象处于编辑模式时显示输入字段而不是文本字段,为此我使用可见绑定。所以我需要一个布尔可观察对象。

如何在不知道列表中元素数量的情况下执行此操作...我也有添加和删除功能,因此每次创建新元素时都需要向该数组添加更多可观察对象。

我也尝试为我的对象添加一个 ko.observable 元素,但我做不到。

【问题讨论】:

标签: javascript knockout.js knockout-2.0 knockout-3.0 knockout-mvc


【解决方案1】:

我喜欢在observableArray 中使用一个对象。下面是一个内联编辑功能的示例,可以根据需要对任意多的行进行编辑。

function Employee(emp) {
  var self = this;
  self.Name = ko.observable(emp.Name);
  self.Age = ko.observable(emp.Age);
  self.Salary = ko.observable(emp.Salary);
  self.EditMode = ko.observable(emp.EditMode);
  self.ChangeMode = function() {
    self.EditMode(!self.EditMode());
  }
}

function viewModel() {
  var self = this;
  self.Employees = ko.observableArray()
  self.Employees.push(new Employee({
    Name: "Joe",
    Age: 20,
    Salary: 100,
    EditMode: false
  }));

  self.Employees.push(new Employee({
    Name: "Steve",
    Age: 22,
    Salary: 121,
    EditMode: false
  }));

  self.Employees.push(new Employee({
    Name: "Tom",
    Age: 24,
    Salary: 110,
    EditMode: false
  }));
}
var VM = new viewModel();
ko.applyBindings(VM);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<table border=1>
  <thead>
    <tr>
      <th>Name</th>
      <th>Age</th>
      <th>Salary</th>
      <th></th>
    </tr>
  </thead>
  <tbody data-bind="foreach: Employees">
    <tr data-bind="if: !EditMode()">
      <td data-bind="text: Name"></td>
      <td data-bind="text: Age"></td>
      <td data-bind="text: Salary"></td>
      <td><button data-bind="click: ChangeMode">Edit</button></td>
    </tr>
    <tr data-bind="if: EditMode()">
      <td>
        <input data-bind="value: Name">
      </td>
      <td>
        <input data-bind="value: Age">
      </td>
      <td>
        <input data-bind="value: Salary">
      </td>
      <td><button data-bind="click:ChangeMode">Save</button></td>
    </tr>
  </tbody>
</table>

【讨论】:

  • 非常有用,我能够按照我所说的进行编辑,但是在此之后我需要将我的对象转换为 JSON(并且显然没有 EditMode 变量),有没有办法这样做?我试图这样做:var unmapped = ko.mapping.toJS(self.editedResources()); 但它说:无法获取未定义或空引用的属性“toJS”。 ....self.editedResources 是我的可观察数组
  • @DiegoAstiazarán 是ko.toJS()ko.toJSON(),您可以使用delete 在js/json 中删除该属性一次
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 2015-10-05
  • 2017-07-13
  • 1970-01-01
相关资源
最近更新 更多