Uncaught TypeError: Cannot read property 'leng

2019-05-30 03:57发布

I'm working to built a contact list that is grouped by the first letter of the contact's last name.

After a succesfull ajax request, the contact is pushed to addContact:

Ajax success:

    ko.utils.arrayForEach(dataJS.contactList, function(c) {
        contactsModel.addContact(c);
    });

contactsModel.addContact:

//add a contact in the right spot under the right letter
contactsModel.addContact = function(newContact) {
    //grab first character
    var firstLetter = (newContact.lname || "").charAt(0).toUpperCase();
    //if it is a number use #
    if (!isNaN(firstLetter)) {
        firstLetter = "#";
    }

    //do we already have entries for this letter
    if (!this.letterIndex[firstLetter]) {
    //new object to track this letter's contacts
        var letterContacts = {
            letter: firstLetter,
            contacts: ko.observableArray([])
        };

        this.letterIndex[firstLetter] = letterContacts; //easy access to it

        //put the numbers at the end
        if (firstLetter === "#") {
            this.contactsByLetter.push(letterContacts);
        } else {
            //add the letter in the right spot 
            for (var i = 0, lettersLength = this.contactsByLetter().length; i < lettersLength; i++) {
                var letter = this.contactsByLetter()[i].letter;

                if (letter === "#" || firstLetter < letter) {
                     break;  
                }
            }  
            this.contactsByLetter.splice(i, 0, letterContacts);
        }
    }

    var contacts = this.letterIndex[firstLetter].contacts;

    //now we have a letter to add our contact to, but need to add it in the right spot
    var newContactName = newContact.lname + " " + newContact.fname;
    for (var j = 0, contactsLength = contacts().length; j < contactsLength; j++) {
        var contactName = contacts()[j].lName + " " + contacts()[j].fName;

        if (newContactName < contactName) {
           break;  
        }
    }

    //add the contact at the right index
    contacts.splice(j, 0, newContact);

}.bind(contactsModel);

The contacts json object from the server looks like this:

{
        "total_pages": 10,
        "page": page,
        "contactList": [{
            "photo": "http://homepage.mac.com/millhouse/Family%20Tree/images/PersonListIcon.png",
            "lname": "Bond",
            "id": 241,
            "fname": "James",
            "email": "xxx@yahoo.com"},

While this works in jsfiddle, when I try it locally, I get the following error during the first push to addContact:

Uncaught TypeError: Cannot read property 'length' of undefined
jQuery.jQuery.extend._Deferred.deferred.resolveWithjquery-1.5.1.js:869
donejquery-1.5.1.js:6591
jQuery.ajaxTransport.send.callbackjquery-1.5.1.js:7382

Ideas? Thanks

2条回答
乱世女痞
2楼-- · 2019-05-30 04:16

Make sure you wrap your bindings statement in a jQuery ready...

$(function(){
    ko.applyBindings(contactsModel, document.getElementById("view-panel-contacts"));
});

That worked for me using the code you provided in the fiddle.

http://pastebin.com/YYfBB0ES

查看更多
迷人小祖宗
3楼-- · 2019-05-30 04:17

Your syntax looks wrong in the for loops and elsewhere, that is () meant for invoking functions. Try changing everywhere you have contactsByLetter() and contacts() to contactsByLetter and contacts.

查看更多
登录 后发表回答