knockoutjs:值绑定独占或点击事件?

时间:2013-12-11 20:49:53

标签: javascript knockout.js

我正在浏览knockoutjs教程。我轻轻地修改了它,看看会发生什么。所以我开始使用“使用列表和集合”教程。首先,我想用div替换标签(这也不是100%工作,但这不是这篇文章的主题)。然后,我不仅要将表格单元格绑定到模型值,还要有一个事件处理程序 - 比方说onClick。这是代码:

HTML:

<h2>Your seat reservations</h2>

<div data-bind="foreach: seats">
     <div style="clear: left; display: table; width: 100%;"  >
          <input data-bind="value: name; click: $parent.onClick;" type="text"/>
     </div>
     <div style="width: 300px; float: left; display: table; width: 100%">
         <select data-bind="options: $root.availableMeals, value: meal, optionsText: 'mealName'; select: $root.onClick"></select>
     </div>
</div>
<button data-bind="click: addSeat">Reserve another seat</button>

JS:

// Class to represent a row in the seat reservations grid
function SeatReservation(name, initialMeal) {
    var self = this;
    self.name = name;
    self.meal = ko.observable(initialMeal);
}

// Overall viewmodel for this screen, along with initial state
function ReservationsViewModel() {
    var self = this;

    // Non-editable catalog data - would come from the server
    self.availableMeals = [
        { mealName: "Standard (sandwich)", price: 0 },
        { mealName: "Premium (lobster)", price: 34.95 },
        { mealName: "Ultimate (whole zebra)", price: 290 }
    ];    

    // Editable data
    self.seats = ko.observableArray([
        new SeatReservation("Steve", self.availableMeals[0]),
        new SeatReservation("Bert", self.availableMeals[0]),
        new SeatReservation("Kai", self.availableMeals[0])
    ]);

    // Operations
    self.addSeat = function() {
        self.seats.push (new SeatReservation ("<Please fill>", self.availableMeals[0]));
    }

    self.onClick = function () { alert ('Lets make love'); }
}

ko.applyBindings(new ReservationsViewModel());

问题是未正确处理click事件。使用上面的代码,单击input元素将不起任何作用。如果我交换事件和值属性的顺序(data-bind =“click:$ parent.onClick; value:name;”而不是上面的代码)click事件有效,但数据绑定不会发生(输入仍为空)。我看到相同的效果,即使数据绑定标记仅包含点击也不太令人惊讶。 我究竟做错了什么?我想为输入元素提供单击事件处理程序数据绑定。 我在Windows 7上使用Firefox进行测试。

非常感谢 启

1 个答案:

答案 0 :(得分:2)

Knockout中的绑定用逗号分隔,而不是分号。另外,不要使用尾部分号。

<input data-bind="value: name, click: $parent.onClick" type="text"/>