2016-11-04 3 views
1

У меня есть список случайных дат, которые я генерирую на сервере и отправляю обратно в формате json в режим просмотра нокаута в наблюдаемый массив() ([01/02/2016, 01/15/2016, 02/04/2016, 03/05/2016 и т. Д.) И не может полностью обернуть мою голову тем, как перебирать эти даты и создать следующий вывод в html:Цитирование по датам в нокаут и создание группы дат по месяцам

January 
------- 
01/02/2016 
01/15/2016 

February 
------- 
02/04/2016 

March 
------- 
03/05/2016 

и т.д ...

Я понимаю основной цикл просмотра в нокауте, и динамически выводить HTML и все такое. Лучше всего было бы создать наблюдаемый массив для каждого месяца, а затем в html покажет только секцию месяца, если длина наблюдаемого массива этого месяца> 0?

var januaryArray = ko.observableArray(); 
var februaryArray = ko.observableArray(); 

<ul id="januaryList" data-bind="foreach: januaryArray, visible: januaryArray.length > 0"> 


    ..... 

<ul id="februaryList" data-bind="foreach: februaryArray, visible: februaryArray.length > 0"> 
..... 

Или есть лучший, более лаконичный способ сделать это с помощью некоторых утверждений if?

+0

могли бы вы просто фильтровать исходный массив для каждого месяца. используя ko.utils.arrayFilter http://www.knockmeout.net/2011/04/utility-functions-in-knockoutjs.html –

+0

Спасибо за комментарий user2744722. Я просмотрел интернет в течение 2 дней, ища решение этого, и, конечно, минут после публикации этого вопроса, я наткнулся на это: http://stackoverflow.com/questions/27163547/group-events-by-date-using-knockoutjs Сегодня вечером я собираюсь решить проблему, и если это поможет решить мою проблему, я отправлю ее, чтобы она могла помочь другим! – JPitts

ответ

0

здесь один я сделал с помощью ko.utils.arrayfilter

здесь является скрипкой. https://jsfiddle.net/othkss9s/27/

вот javascript.

function model() { 
    var self = this; 
    this.dates = ['01/02/2016', '01/15/2016', '02/04/2016', '03/05/2016']; 

    this.months = ko.observableArray([{ 
    name: 'January', 
    value: '01' 
    }, { 
    name: 'February', 
    value: '02' 
    }, { 
    name: 'March', 
    value: '03' 
    }]); 

    this.filteredDates = function(data) { 
    return ko.utils.arrayFilter(self.dates, function(item) { 
     return item.substr(0, 2) === data.value; 
    }); 
    }; 
} 

var myViewModel = new model(); 

$(document).ready(function() { 
    ko.applyBindings(myViewModel); 

}); 

вот HTML

<ul data-bind="foreach: months"> 
    <li> 
    <b data-bind="text: $data.name"></b> 
    <ul data-bind="foreach: $root.filteredDates($data)"> 
     <li> 
     <b data-bind="text: $data"></b> 
     </li> 
    </ul> 
    </li> 
</ul> 
Смежные вопросы