Нарисуйте график в JS [duplicate]

Как сказал @KyssTao, help(dates.num2date) говорит, что x должен быть float, дающим число дней с 0001-01-01 плюс один. Следовательно, 19910102 не 2 / янв / 1991, потому что, если вы посчитали 19910101 дней с 0001-01-01, вы получите что-то в год 54513 или подобное (разделите на 365,25, количество дней в году).

Вместо этого используйте datestr2num (см. help(dates.datestr2num)):

new_x = dates.datestr2num(date) # where date is '01/02/1991'
9
задан corycorycory 26 August 2016 в 14:15
поделиться

2 ответа

Мое предложение состоит в создании специального класса для инкапсуляции этих переменных.

var ViewModel=function(selector){

  this.dom=document.querySelector(selector);//here DOM element
  this.value=null;

};

//method sets value
ViewModel.prototype.set=function(value){

   if (value===this.value)
   return;//the same value

   this.value=value;//new value


   this.dom.innerText=this.value; //most important changing in DOM

};

//method gets value
ViewModel.prototype.get=function(){

  return this.value;

};

Использование:

var x=new ViewModel("#selector");

x.set(100);

Пример проверки в jsFiddle - https://jsfiddle.net/maciejsikora / wrd14kwk /

3
ответ дан Maciej Sikora 16 August 2018 в 03:56
поделиться

Вы запрашиваете простую реализацию (без больших фреймворков) шаблона наблюдателя, в идеале просто предоставляя имя переменной и идентификатор элемента в качестве аргументов.

То, о чем вы просите, возможно, если мы определим функцию bind() для повторного опроса x, чтобы увидеть, изменилась ли она. Обратите внимание, что bind следует называть так:

bind('x','value_display');

Рабочий пример:

var x = 100;

function bind(varName, elementId){
  var lastValue;
  function check(){
    if(lastValue !== window[varName]){
      lastValue = window[varName];
      document.getElementById(elementId).innerHTML = lastValue; 
    }
  }
  //poll for changes every 50 milliseconds
  setInterval(check, 50); 
}

//bind x to value_display

bind('x','value_display');

//test function by changing x every 100th millisecond

setInterval(function(){
    x = +new Date;
  },
  100
);
<div id="value_display"></div>

Лично я предпочел бы облегченный модуль издателя / подписчика с использованием функции опроса, но для этого потребуется назначить переменной x для управления функцией / методом (какой-то сеттер). Если вы исследуете (google) шаблон наблюдателя или паб / подзаголовок, вы найдете простые способы реализации этого кода гораздо меньше, чем большая фреймворк, но, вероятно, не такой легкий, как подход к опросу.

0
ответ дан Tomas Langkaas 16 August 2018 в 03:56
поделиться
  • 1
    Я должен не согласиться с вашим последним заявлением, «не столь легким, как подход к опросу», и тем, что он предлагает, - что опрос как-то легкий. Десятки, сотни, тысячи или потенциально миллионы бесполезных вызовов функций, если значение не меняется, по моему мнению, не является легким. Но вы правы, «какой-то сеттер», может использоваться вместо этого. Пожалуйста, рассмотрите следующий repl.it/@dexygen/DemystifyingOneWayBinding , который является лишь первой попыткой, но работает. Конструктор объекта может казаться ненужным, но это то, что я использую в своих собственных рамках – George Jempty 19 November 2017 в 16:30
Другие вопросы по тегам:

Похожие вопросы: