Javascript 为什么我的WinJS分组绑定列表会播放带有某些项目的音乐椅?

Javascript 为什么我的WinJS分组绑定列表会播放带有某些项目的音乐椅?,javascript,data-binding,winjs,Javascript,Data Binding,Winjs,我正在创建一个学生分组列表,如下例所示: 创建分组的实际代码和HTML几乎完全相同(名称更改是安全的) 然后,我将一些项目推送到原始列表()中,该列表也会更新GroupedList()。那部分很好用 然而,我看到的是: 此列表应按名字分组(显示的是“Lastname,Firstname”)。我在这里看到的是,第1项应该在“S”中,第3项应该在“A”中,第6项应该在“I”中 我所做的唯一不同于示例的事情是数据源,因为我正在push()。 但是,getGroupKey(dataItem)和其他分组

我正在创建一个学生分组列表,如下例所示: 创建分组的实际代码和HTML几乎完全相同(名称更改是安全的)

然后,我将一些项目推送到原始列表()中,该列表也会更新GroupedList()。那部分很好用

然而,我看到的是:

此列表应按名字分组(显示的是“Lastname,Firstname”)。我在这里看到的是,第1项应该在“S”中,第3项应该在“A”中,第6项应该在“I”中

我所做的唯一不同于示例的事情是数据源,因为我正在
push()。
但是,
getGroupKey(dataItem)
和其他分组函数正在正常工作,即返回正确的值

有什么想法吗?因为否则我必须考虑使用两个数组(一个是List(),另一个是类实例所在的数组),然后我必须为它们编写同步例程以保持数据的一致性,而这正是我真正想要逃避的

代码如下,仅相关片段

定义列表和分组函数:


函数比较组(左键、右键){
返回leftKey.charCodeAt(0)-righkey.charCodeAt(0);
}
函数getGroupKey(dataItem){
返回dataItem.lastname.toUpperCase().charAt(0);
}
函数getGroupData(dataItem){
返回{
标题:dataItem.lastname.toUpperCase().charAt(0)
};
}
var pupilsList=new WinJS.Binding.List({Binding:true});
var groupedPupilsList=pupilsList.createGrouped(getGroupKey、getGroupData、CompareGroup)

数据来源:

var Schueler = WinJS.Class.define(function (original, id, firstname, lastname, tutor_id, picture, email, phone, notes, birthday, classes) {
    var that = this;
    this._classnames = new Array();
    if (original) {
        [... irrelevant part snipped ...]
        });
    } else {
        var row = id;
        this._id = row.rowid;
        this._firstname = row.firstname_enc;
        this._lastname = row.lastname_enc;
        this._tutor_id = row.tutor_id;
        this._picture = row.picture_enc;
        this._email = row.email_enc;
        this._phone = row.phone_enc;
        this._notes = row.notes_enc;
        this._birthday = row.birthday_enc;
        this._guid = row.guid;
        this.updateClassnames();
    }
},
{
    id: {
        get: function () {
            return this._id;
        },
        set: function (id) {
            this._id = id;
        }
    },
    firstname: {
        get: function () {
            return this._firstname;
        },
        set: function () {
            //TODO
        }
    },
    lastname: {
        get: function () {
            return this._lastname;
        },
        set: function () {
            //TODO
        }
    },
    [... irrelevant parts snipped ...]
    classnames: {
        get: function () {
            return this._classnames.join(", ");
        },
        set: function (names) {
            this._classnames = names;
        }
    },
    updateClassnames: function () {
        var that = this;
        SQLite3JS.openAsync(DataLayer.db_path)
        .then(function (db) {
            var sql = "SELECT Classes.name_enc FROM Classes JOIN Classes_Pupils ON Classes.rowid = Classes_Pupils.class_id JOIN Pupils ON Classes_Pupils.pupil_id = Pupils.rowid WHERE Pupils.rowid = {0};".format(that._id);
            return db.allAsync(sql)
            .then(function (results) {
                db.close();
                var names = new Array();
                for (var i = 0; i < results.length; i++) {
                    names.push(results[i].name_enc.toString().decrypt());
                }
                that.classnames = names;
                DataLayer.PupilsList.dispatchEvent("reload");
            }, function (error) {
                if (error.message.indexOf("database is locked") > -1) {
                    console.log("DB locked, will try again in 50 ms");
                    window.setTimeout(that.updateClassnames(), 50);
                }
            });
        });
    }
},
{
    reconstructAll: function () {
        DataLayer.retrieveSeveralRows("Pupils", function (results) {
            for (var i = 0; i < results.length; i++) {
                DataLayer.PupilsList.push(new Schueler(false, results[i]));
            }
        });
    }
});
WinJS.Namespace.define("DataLayer", {
    Schueler: Schueler
});

我看到您现在正在使用CreateSorder,但是您还可以做一些其他事情来诊断原始问题

首先,尝试使用一些静态数据,而不是动态填充列表

其次,在getGroupKey和getGroupData函数中放入一些console.log输出,以便准确地评估返回的内容


我应该提到的另一件事是,MSDN文档页面显示的代码对所有本地语言都不敏感。也就是说,使用字符串的第一个字符作为排序顺序并不总是正确的。Windows.Globalization.Collation()中有一个API,用于正确处理排序。如果查看文件groupeddata.js中的
[HTML ListView Grouping and Semantic Zoom sample][1]
,您将看到这是如何使用的。这不应该影响你的数据,但我想提一下

我已经记录了有关的函数。它们实际上返回正确的值。我会看看本地化的东西。由于我只使用ASCII字符,我有点困惑,究竟为什么这应该是一个问题…我提到本地化的东西,因为即使在ASCII字符集内,排序顺序也可能因语言而异。不管怎样,你有一些复制代码可以分享吗?我对深入研究很感兴趣,但不想从头开始重新编写。我在visualstudio网站上的git repo中找到了我的代码。如果你愿意,我可以让你进入。好吧,我会被诅咒的。似乎这确实是一个本地化问题。谢谢你的帮助和耐心!很高兴听到这个消息。我对这种可能性持怀疑态度,因为我在你的截图中看到了非英语文本,而ASCII实际上只有英语才可靠:)
var charGroups = Windows.Globalization.Collation.CharacterGroupings();
function getGroupKey(dataItem) {
    return charGroups.lookup(dataItem.lastname.toUpperCase().charAt(0));
}