2016-09-05 3 views
0

У меня есть данные, что я возвращаюсь в JSON следующим образом:Формата нумерованного список JSON в HTML

{ 
"Text": "This is 1", 
"Number": "1." 
}, 
{ 
"Text": "This is 2 ", 
"Number": "2." 
}, 
{ 
"Text": "This is 3 ", 
"Number": "3." 
}, 
{ 
"Text": "test indent", 
"Number": "a." 
}, 
{ 
"Text": "test indent 2", 
"Number": "b." 
}, 
{ 
"Text": "insrt 1", 
"Number": "i." 
}, 
{ 
"Text": "back to indent ", 
"Number": "c." 
}, 
{ 
"Text": "This is 4 ", 
"Number": "4." 
} 

Я отображающий его в HTML с нокаутом следующим образом:

<div data-bind="foreach: numberedList, visible: numberedList().length > 0"> 
<span data-bind="text: number"></span> 
<span data-bind="html: text"></span><br /> 
</div> 

Какой функции/code Мне нужно добавить, что данные должны быть отступом в соответствии с цифрами/буквами? Я хочу, чтобы страница HTML выглядеть следующим образом: enter image description here

Спасибо

+0

Для отступа вы можете просто использовать CSS –

+0

есть способ указать в CSS для выравнивания различных чисел в списке (а, 1, я, и т.д.)? Спасибо – shw

+0

Покажите пример, как вы хотите выровнять разные цифры в своем представлении. –

ответ

1

Чтобы реализовать то, что вы хотите, вам нужно изменить структуру своих данных. Между вашими текущими данными и реализацией такой вещи нет никакой связи с такими данными.

Вот пример того, как может быть ваши данные: https://jsfiddle.net/kyr6w2x3/76/

HTML:

<div data-bind="foreach:Items"> 
    <span data-bind="text:Number"></span><span data-bind="text:Text"></span> 
    <div data-bind="foreach:Children"> 
    <div class="sub-1"> 
     <span data-bind="text:Number"></span><span data-bind="text:Text"></span> 
    </div> 
    <div data-bind="foreach:Children"> 
     <div class="sub-2"> 
      <span data-bind="text:Number"></span><span data-bind="text:Text"></span> 
     </div> 
    </div> 
    </div> 
</div> 

JS:

data = [ 
    { 
     "Text":"This is 1", 
     "Number":"1.", 
     "Children":[] 
    }, 
    { 
     "Text":"This is 2", 
     "Number":"2.", 
     "Children":[] 
    }, 
    { 
     "Text":"This is 3", 
     "Number":"3.", 
     "Children":[ 
     { 
      "Text":"test indent", 
      "Number":"a.", 
      "Children":[] 
     }, 
     { 
      "Text":"test indent 2", 
      "Number":"b.", 
      "Children":[ 
       { 
        "Text":"insert i", 
        "Number":"i.", 
        "Children":[] 
       } 
      ] 
     }, 
     { 
      "Text":"back to indent", 
      "Number":"c.", 
      "Children":[ 

      ] 
     }, 

     ] 
    } 
] 
function AppViewModel() { 
    var self = this; 
    self.Items = ko.observableArray(data); 
} 
var VM = new AppViewModel() 
ko.applyBindings(VM); 
+0

Спасибо за ваш ответ - может быть до 4 подуровней - значит ли это, что мне нужно будет делать 4 цикла? Я думал, что было бы неплохо, если бы я мог просто поставить один цикл для всего, но если данные такие грязные, Я реструктурирую его. – shw

+0

, если вы хотите поместить их все в один цикл, тогда вам нужно иметь отношение между вашими данными, такими как 'id',' parentId', но снова вы будете иметь некоторые операторы if внутри цикла, чтобы применить правильные данные с правильным классом для отступов, используя эти отношения (id, parent-id). Если вы посмотрите на сложность вложенных циклов, то обозначение «большой-O» обычно (не всегда) равно O (n²). Математически мы можем сказать, что в худшем случае он выполнит n² раз, но «Big-O» не всегда точно определяет, сколько работы выполняется. Вам решать, с кем идти, я бы пошел с вложенными петлями. –

+0

Вложенные петли, похоже, имеют для меня больше смысла. Я обновлю свою структуру данных. Большое спасибо! – shw

-1

Я хотел бы сделать переменную, чтобы подтолкнуть этот JSON в нем.

var data = []; data.push({"Text": "This is 1","Number": "1."}); , а затем я бы сделал функцию, чтобы вернуть его на экран. вам также нужно показать какую-то работу, попробовать и показать, какую функцию вы пытаетесь сделать, MDN - это хорошее место для поиска информации.

0

Вот как это сделать в CSS, используя класс имена. Если вы хотите, чтобы вложенность определяла тип, вы можете заменить имена классов для селекторов типов ol > ol.

ol.alpha { 
 
    counter-reset: alphalist; 
 
} 
 

 
ol.alpha > li { 
 
    list-style: none; 
 
} 
 

 
ol.alpha > li::before { 
 
    content: counter(alphalist, lower-alpha)". "; 
 
    counter-increment: alphalist; 
 
} 
 

 

 
ol.roman { 
 
    counter-reset: romanlist; 
 
} 
 

 
ol.roman > li { 
 
    list-style: none; 
 
} 
 

 
ol.roman > li::before { 
 
    content: counter(romanlist, lower-roman)". "; 
 
    counter-increment: romanlist; 
 
}
<ol> 
 
    <li>Item 1</li> 
 
    <li> 
 
    Item 2 
 
    <ol class="alpha"> 
 
     <li>Item A</li> 
 
     <li> 
 
     Item B 
 
     <ol class="roman"> 
 
      <li>Item I</li> 
 
      <li>Item II</li> 
 
     </ol> 
 
     </li> 
 

 
     <li>Item C</li> 
 
    </ol> 
 
    </li> 
 
    <li>Item 3</li> 
 
    <li>Item 4</li> 
 
</ol>

+0

Спасибо за ваш ответ, проблема у меня в том, что он в одном списке, и мне нужно было поместить его в один список в код – shw