简体   繁体   English

在嵌套的observableArray中映射数据时的淘汰赛麻烦

[英]Trouble in Knockout when mapping data in nested observableArray

I have trouble trying to map data in a nested observableArray (timeSlots). 我很难尝试在嵌套的observableArray(timeSlots)中映射数据。 When I fill my participants observableArray it works just fine. 当我填写参与者的observableArray时,它就可以正常工作。 I bet I have to do something special when it's nested. 我敢打赌,嵌套时必须做一些特别的事情。

I'm new to Knockout so not sure what I am doing wrong. 我是Knockout的新手,所以不确定自己做错了什么。 I've been looking at the documentation to no avail, especially at: 我一直在看文档无济于事,尤其是在:

http://knockoutjs.com/documentation/plugins-mapping.html http://knockoutjs.com/documentation/plugins-mapping.html

Here is my code: (EDITED) 这是我的代码:(已编辑)

<script type="text/javascript">

var TimeSlot = function (startTime, endTime) {
    var self = this;
    self.startTime = startTime;
    self.endTime = endTime;
};

var Participant = function (id, timeSlots) {
    var self = this;
    self.Name = id;
    self.roomName = ko.observable();
    self.timeSlots = ko.observableArray();

    var timeSlotVMs = _.map(timeSlots, function(ts) {
        return new TimeSlot(ts.startTime, ts.endTime);
    });

    ko.utils.arrayPushAll(self.timeSlots(), timeSlotVMs);
};

function ViewModel() {
    var self = this;
    self.participants = ko.observableArray([]);

    self.addPerson = function () {
         var data = '{"TimeSlot":[{"startTime":"05:23","endTime":"06:32"},
                     {"startTime":"10:23","endTime":"11:32"}]}';
         var partViewModel = new Participant(self.selectedValue().Id(), data.TimeSlot);
         self.participants.push();
    };
};



var viewModel = new ViewModel();
ko.applyBindings(viewModel);

</script>

And HTML if needed: 和HTML(如果需要):

<tbody data-bind="foreach: viewModel.participants">
    <tr>
        <td data-bind="text: Name"></td>
        <td data-bind="text: roomName"></td>

        <td data-bind="foreach: viewModel.participants.timeSlots">
                <span data-bind="text: startTime"></span>
        </td>
    </tr> 
</tbody>

Try this: 尝试这个:

var TimeSlot = function (startTime, endTime) {
    var self = this;
    self.startTime = startTime;
    self.endTime = endTime;
};

var Participant = function (id, timeSlots) {
    var self = this;
    self.Name = id;
    self.roomName = ko.observable();
    self.timeSlots = ko.observableArray();

    var timeSlotVMs = _.map(timeSlots, function(ts) {
        return new TimeSlot(ts.startTime, ts.endTime); 
    });
    ko.utils.arrayPushAll(self.timeSlots(), timeSlotVMs);        
};

function ViewModel() {
    var self = this;
    self.participants = ko.observableArray();

    self.addPerson = function () {
         var data = {
             TimeSlot: [
               {startTime:"05:23",endTime:"06:32"},
               {startTime:"10:23",endTime:"11:32"}
            ]
         };
         var partViewModel = new Participant(123, data.TimeSlot);
         self.participants.push(partViewModel);
    };
};

I used lodash library function 'map', to create array of viewmodels. 我使用lodash库函数'map'创建了ViewModel数组。

Also, you have error in your layout. 另外,您的布局有误。 Use timeSlots instead viewModel.participants.timeSlots: 使用timeSlots代替viewModel.participants.timeSlots:

<tbody data-bind="foreach: participants">
    <tr>
        <td data-bind="text: Name"></td>
        <td data-bind="text: roomName"></td>

        <td data-bind="foreach: timeSlots">
            <span data-bind="text: startTime"></span>
        </td>
    </tr> 
</tbody>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM