Javascript Knockout.js:选择下拉问题,始终设置;“选定项目”;对于第一个选项,即使使用;“初始数据”;

Javascript Knockout.js:选择下拉问题,始终设置;“选定项目”;对于第一个选项,即使使用;“初始数据”;,javascript,knockout.js,Javascript,Knockout.js,jsFiddle: 尽管我已经为所选技能数组提供了“初始数据”,但$data将成为选择框中的第一项 var initialData = [ { id: '1', name: "Batman", isDelete: false, selected_skill: { <--- This part right here. id: '2', name: "Boxing", isDele

jsFiddle:

尽管我已经为
所选技能
数组提供了“初始数据”,但
$data
将成为选择框中的第一项

var initialData = [
    {
    id: '1',
    name: "Batman",
    isDelete: false,
    selected_skill: {              <--- This part right here.
        id: '2',
        name: "Boxing",
        isDeleted: false
    },
    skills: [
        {
        id: '1',
        name: "Karate",
        isDeleted: false},
    {
        id: '2',
        name: "Boxing",
        isDeleted: false
    },
    {
        id: '6',
        name: "Sonar",
        isDeleted: false}
    ]},
{
    id: '2',
    name: "Hulk",
    isDelete: false,
    skills: [
        {
        id: '3',
        name: "MMA",
        isDeleted: false},
    {
        id: '4',
        name: "Rage",
        isDeleted: false},
    {
        id: '5',
        name: "Extra Strength",
        isDeleted: false}
    ]},
    ];
jsFiddle:

更新:

我的real app中的
初始数据是使用
$.getJSON()
加载的。我是这样做的:

$.getJSON(appUrl+"/getstuff/hero.json", 
    function(data){
        ko.applyBindings(new Hero(data));
    }
);
我可以看到Firebug控制台的结果是“装箱”——我得到
Object{id=“2”,nameL:“装箱”,isDelete:false}
。但是当所有的东西都被渲染后,
selected\u skill
将成为第一个选项

我希望这是有意义的。如果没有,我很乐意通过评论回答澄清

最终更新

我用过:

return item.id() === data.selected_skill.id 
而不是

return data.selected_skill && skill.id === data.selected_skill.id; 
然后它成功了


我已标记了正确答案。

问题在于
所选的\u skill
对象与skills数组中的对象不同,而不是对同一对象的引用

在JavaScript中

var a = { name: "Bob" };
var b = { name: "Bob" };
var c = a;

alert(a === b);  //false - different objects
alert(a === c);  //true - reference to the same object

您需要运行一些逻辑来将所选对象与列表中的对象相匹配。可能是这样的:

如果您在firebug/chrome开发控制台中查看生成的HTML,似乎option元素的值根本没有被赋值。因此,所选的_技能没有匹配的价值。也许你可以从那里开始,我不知道这是什么意思。但是,即使您单击“灰色框”,然后单击“设置为默认值”,并查看开发控制台中的检查器,您也无法看到html的更改-但是选择框的值已更新。RP Niemeyer,非常感谢JS对象的解释。这绝对是我想要的。但是在我的应用程序中,我通过
$.getJSON()
获取初始数据-我有新的逻辑来匹配列表中选定的对象,但我仍然得到第一个选项。仅供参考,JSON结果具有“装箱”功能,但在呈现数据时,它将“默认”为第一个选项。你的想法?rp niemeyer,我用我使用的
return item.id()==data.selected\u skill.id
更新了我的问题
return data.selected\u skill&&skill.id==data.selected\u skill.id然后它工作了。
var a = { name: "Bob" };
var b = { name: "Bob" };
var c = a;

alert(a === b);  //false - different objects
alert(a === c);  //true - reference to the same object