【问题标题】:Trouble in Knockout when mapping data in nested observableArray在嵌套 observableArray 中映射数据时出现问题
【发布时间】:2013-11-07 00:30:12
【问题描述】:

我在尝试将数据映射到嵌套的 observableArray (timeSlots) 时遇到问题。 当我填充我的参与者 observableArray 时,它工作得很好。我敢打赌,当它嵌套时,我必须做一些特别的事情。

我是 Knockout 的新手,所以不确定我做错了什么。 我一直在查看文档无济于事,尤其是在:

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

这是我的代码:(已编辑)

<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>

如果需要还有 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>

【问题讨论】:

标签: javascript web knockout.js knockout-mapping-plugin


【解决方案1】:

试试这个:

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);
    };
};

我使用lodash 库函数“map”来创建视图模型数组。

另外,您的布局有误。使用 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>

【讨论】:

  • 我不得不修改为 var timeSlotVMs = _.map(timeSlots, function(ts) { return new TimeSlot(ts.startTime, ts.endTime); });让它运行,但是我仍然没有让它工作
  • 你能用新代码更新你的问题吗?或创建here
  • 删除了“viewModel.participants.timeSlots”,只写了timeSlots。恐怕还是不行。
  • 我再次更新了我的答案并创建了一个有效的demo
  • 抱歉回复晚了。它适用于您的解决方案,谢谢。
猜你喜欢
  • 2019-03-13
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多