Как установить значения в массив, используя foreach - PullRequest
0 голосов
/ 04 июля 2019

Как я могу добавить значения в массив, используя цикл. Я добавил значения в массив с помощью жестких значений, но мне нужно добавить огромные данные в массив. Так что это трудно сделать с помощью жесткого кодирования. эта часть моего кода JS.

function BModel(checkInOrEdit) {
    "use strict";
    this.Number = ko.observable("");
    this.Years = ko.observableArray(['', '2019', '2018', '2017', '2016', '2015', '2014', '2013', '2012', '2011', '2010', '2009', '2008', '2007', '2006', '2005', '2004', '2003', '2002', '2001', '2000']);
}

BModel.prototype = {

    addTo: function (isSupervised) {
        "use strict";
        this.fname($.trim(this.fname()));
        this.lname($.trim(this.lname()));

    },

    AcDone: function (result, stat) {
        "use strict";
        var validationResults = JSON.parse(result.d);
        var msgTitle = '';
    }
}


$(document).ready(function () {

});

Мне нужно добавить значения к Years с этого года до 1900 года. Как я могу это сделать. В настоящее время я в жестких связях.

this.Years = ko.observableArray(['', '2019', '2018', '2017', '2016', '2015', '2014', '2013', '2012', '2011', '2010', '2009', '2008', '2007', '2006', '2005', '2004', '2003', '2002', '2001', '2000']);

Ответы [ 2 ]

3 голосов
/ 04 июля 2019

Я бы посоветовал создать помощника, который сначала возвращает диапазон чисел в обычном массиве. Затем вы можете использовать помощник для инициализации вашего наблюдаемого массива.

Перемещение в наблюдаемый массив в foreach может привести к риску перерисовки DOM много, много раз!

Вот пример range помощника (может быть изменен, чтобы быть более кратким) и наблюдаемого массива:

function range(from, to) {
  const dir = to > from ? 1 : -1
  return Array.from(
    Array(Math.abs(to - from) + 1),
    (_, i) => from + dir * i
  )
};

const years = ko.observableArray(
  [""].concat(range(new Date().getFullYear(), 1900))
);

ko.applyBindings({ years });
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<ul data-bind="foreach: years">
  <li data-bind="text: $data"></li>
</ul>
1 голос
/ 04 июля 2019

Вы можете сделать это так:

function BModel(checkInOrEdit) {
  "use strict";
  this.Number = ko.observable("");
  this.Years = ko.observableArray();
  let lyears = [];
  for (let i = 1900; i <= new Date().getFullYear(); i++) { 
    lyears.push(i);
  }
  this.Years(lyears); // see comments
}

Это не самый элегантный способ, но именно так вы бы поступили, если бы хотели использовать цикл.

...