【问题标题】:Updating Knockout.js Observable array element value更新 Knockout.js 可观察数组元素值
【发布时间】:2012-06-30 01:58:47
【问题描述】:

我需要更新一个可观察的数组元素值。 可观察数组是类对象的集合。 首先,我需要通过 id 找出匹配的对象并更新该对象的一些其他属性值。

var Seat = function(no, booked) {
    var self = this;
    self.No = ko.observable(no);
    self.Booked = ko.observable(!!booked);

    // Subscribe to the "Booked" property
    self.Booked.subscribe(function() {
        alert( self.No() );
    });
};

var viewModel = {
    seats: ko.observableArray( [
        new Seat(1, false), new Seat(2, true), new Seat(3, true),
        new Seat(4, false), new Seat(5, true), new Seat(6, true),
        new Seat(7, false), new Seat(8, true), new Seat(9, true)
    ] )
};

谁能建议更新视图模型的方法? 假设我想将 2 号座位的预订价值更新为“false”。

http://jsfiddle.net/2NMJX/3/

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    淘汰赛很简单:

    // We're looking for the Seat with this No 
    var targetNo = 2;
    
    // Search for the seat -> arrayFirst iterates over the array and returns the
    // first item that is a match (= callback returns "true")!
    var seat = ko.utils.arrayFirst(this.seats(), function(currentSeat) {
        return currentSeat.No() == targetNo; // <-- is this the desired seat?
    });
    
    // Seat found?
    if (seat) {
        // Update the "Booked" property of this seat!
        seat.Booked(true);
    }
    

    http://jsfiddle.net/2NMJX/4/

    【讨论】:

    • 要设置多个属性时会发生什么?像这里我们只有seat.Booked,如果有多个属性我想使用ko.mapper插件,有没有办法做到这一点?
    • 您可以使用淘汰赛的替换功能来更新整个项目:this.seats.replace(seat, newSeat);
    • 我需要更多关于如何向服务器生成查询的信息(我猜项目有一些 ID),以及服务返回什么数据(休息?)
    【解决方案2】:
    viewModel.seats()[self.No()].Booked(true);
    

    【讨论】:

      猜你喜欢
      • 2018-11-26
      • 1970-01-01
      • 2019-12-16
      • 2016-11-26
      • 2016-03-13
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多