2

在下面的代码中;为什么“self.Addticket-function”中的“self.ticketCollection.indexOf(t)”总是-1?

在 page_load 之后,我推送 New (newTicket),然后是 ADD (addTicket)。这可以正常工作,并且 ("ny","-1") 的记录被添加到我的 ticketCollection 中。然后,当我重复此操作时,添加了另一条完全相同的记录。调试器(FireBug)告诉我“self.ticketCollection.indexOf(t)”在这两种情况下都是-1。为什么?

function Ticket(ticketname, cost) {
    var self = this;

    //alert("ikke implementer fullt ut ennå!");

    self.ticketname = ko.observable(ticketname);
    self.cost= ko.observable(cost);

} // end Ticket

//==============================================================

function ViewModel() {
var self = this;

//------ initiate ----------------------------------------------

// the product we want to view/edit
self.selectedTicket = ko.observable();

self.ticketCollection = ko.observableArray(
    [
        new Ticket("Bus", "$2"),
        new Ticket("Ferry", "$3"),
        new Ticket("Bicycle", "$1")
    ]);

// selected item from ticket list-view
self.listViewSelectedItem = ko.observable();

// push any changes in the list view to our main selectedTicket
self.listViewSelectedItem.subscribe(function (ticket) {
    if (ticket) {
        self.selectedTicket(ticket);
    }
}); // self.listViewSelectedItem.subscribe //


//---- NEW button pressed --------------------------------------
self.newTicket = function () {

        // create a new instance of a Ticket
        var t = new Ticket("ny", "-1");

        // set the selected Ticket to out new instance
        self.selectedTicket(t);

    }.bind(this);

//---- ADD to collection -----------------------------------------

self.addTicket = function () {
        //alert("ADD is pushed!");

        // get a reference to out currently selected product
        var t = self.selectedTicket();

        // ignore if null
        if (!t) { return; }

        // check to see that the ticket doesn\t already exist
        if (self.ticketCollection.indexOf(t) > -1) {
            return;
        }

        // add the product to the collection
        self.ticketCollection.push(t);

        // clear out the selected product
        self.selectedTicket(t);
        //self.listViewSelectedItem(t)

    };
} // end ViewModel

提前谢谢!

阿斯莱 :)

4

1 回答 1

4

仅仅因为您有两个Ticket对象包含完全相同的值,并不意味着这两个对象是相等的。这就是为什么indexOf每次都返回 -1 的原因——因为ticketCollection可观察数组不包含您正在检查的确切项目。这个 SO question 很好地解释了 JavaScript 对象相等性:如何确定两个 JavaScript 对象的相等性?

而不是使用indexOf数组上的 ,您应该检查您的任何项目是否与新的传入票证的the和 theticketCollection相匹配。ticketNamecost

我将添加一个示例来说明我的意思:

for(var i=0, len=self.ticketCollection().length; i < len; i++){
if ((t.ticketname() === ticketCollection()[i].ticketname()) && (t.cost() === ticketCollection()[i].cost())) {
    alert('Found the object in the observable array')
}
于 2013-08-23T14:19:11.083 回答