【问题标题】:Knockout master detail not working with select淘汰赛主详细信息不适用于选择
【发布时间】:2012-12-10 09:28:30
【问题描述】:
here`see my fiddle

http://jsfiddle.net/kirannandedkar/JUChh/2/

当我单击名称时,它不会加载选择列表并给出预期功能的错误。 实际上我想加载选择并且应该选择值。当我在选择中更改某些内容时,它应该会反映在列表中。目前 ModuleId 没有被填充到列表中,当我点击列表时它没有填充选择列表。

视图模型:

var Person = function(id, name, country,ModuleId) {
    var self = this;
    self.id = ko.observable(id);
    self.name = ko.observable(name);
    self.country = ko.observable(country); 
    self.ModuleId= ko.observable(ModuleId);
    return self;
};

var vm = (function() {
    var people = ko.observableArray(),
        selectedPerson = ko.observable();
        self.editModuleId = ko.observable();
        self.modules = ko.observableArray([{"Id": 1,"ModuleName": "M1"},{"Id":2,"ModuleName":"M2"}]);

        getPeople = function() {
            people.push(new Person(1, 'John', 'USA',1));
            people.push(new Person(2, 'Mike', 'UK',1));
            people.push(new Person(3, 'Dan', 'AUS',2));
        },
        selectPerson = function(p){
            selectedPerson(p);
             self.editModuleId(ko.utils.arrayFirst(self.modules(), function (data) {
                    console.log("item module id " + p.ModuleId());
                    return data.Id() === p.ModuleId();
                }));
        };



    getPeople();

    return {
        people: people,
        selectedPerson: selectedPerson,
        selectPerson : selectPerson 
    };
})();


ko.applyBindings(vm);

查看:

<ul data-bind="foreach: people">
 <li data-bind="text:name, click:$parent.selectPerson"></li>
<li data-bind="text:$root.editModuleId,click:$parent.selectPerson"></li>

</ul>

<div data-bind="with:selectedPerson">
<span data-bind="text:id"></span>
<input data-bind="value:name"/>
    <input data-bind="value:country"/>
    <select data-bind = "options:$root.modules,value:$root.editModuleId,optionsText:'ModuleName'"/>
</div>

【问题讨论】:

  • 你添加了jquery自定义插件吗?
  • @akeeseth : 我没有添加任何自定义插件

标签: knockout.js


【解决方案1】:

Modules 可观察数组包含没有可观察对象的简单 js 对象,因此在访问其属性时无需输入 ()。从 selectPerson 函数中的 data.Id 中删除它:

selectPerson = function(p){
    selectedPerson(p);
     editModuleId(ko.utils.arrayFirst(modules(), function (data) {
            console.log("item module id " + p.ModuleId());
            return data.Id === p.ModuleId();
        }));
};

这是工作小提琴:http://jsfiddle.net/JUChh/3/

我仔细查看了您的代码,发现editModuleId 是多余的。您在 selectedPerson 对象中需要属性 - ModuleId 并且应该将下拉列表的值绑定到它。

这里是重构的小提琴:http://jsfiddle.net/JUChh/18/

【讨论】:

  • 现在可以正确选择模块 ID。但我在列表中看不到模块 ID,如果我更改模块 ID,那么它应该在列表中更改
  • 请回答我最后的评论。我会非常感谢你
猜你喜欢
  • 1970-01-01
  • 2016-08-24
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
  • 2014-08-05
  • 2013-03-30
  • 2013-01-13
相关资源
最近更新 更多