Время автообновленияСтарое значение с даты отправки

РЕДАКТИРОВАТЬ: я думаю, что должен сделать вещи более очевидными.
Я пытаюсь сделать так, чтобы функция, отображающая «время назад» с даты отправки сообщения, автоматически обновлялась каждую минуту, чтобы оно оставалось относительно точен, даже если шаблон не обрабатывается повторно.

Я хотел бы автоматически обновить свое значение timeago в моем шаблоне, но оно не работает.

Я попытался настроить свой код с реактивной функцией, основываясь на ответе на аналогичный вопрос (https://stackoverflow.com/a/17933506)

Вот мой код:

var timeAgoDep = new Deps.Dependency(); // !!!
var timeAgo;
var timeAgoInterval;

Template.postItem.created = function() {
    function getTimeago() {
        //var now = new Date();
        timeAgo = moment(this.submitted).twitter();
        timeAgoDep.changed(); // !!!
    };

    getTimeago(); /* Call it once so that we'll have an initial value */
    timeAgoInterval = Meteor.setInterval(getTimeago, 5000);
};

Template.postItem.posted = function() {
    timeAgoDep.depend(); // !!!
    return timeAgo;
};

Template.postItem.destroyed = function() {
    Meteor.clearInterval(timeAgoInterval);
};

Я почти уверен, что проблема связана с this.submitted, потому что, например, если я назначу timeAgo = now, он будет отображать время и обновлять, как и предполагалось.

Я также знаю, что moment (this.submitted) .twitter () отлично работает, потому что, когда все, что я делаю, это возвращаю его через помощника, он работает.


person oliv23    schedule 25.06.2014    source источник


Ответы (1)


Гораздо лучший способ сделать это - просто принять реактивность Meteor и реактивно отображать зависящие от времени значения. В вашем случае проблема в том, что вы аннулируете зависимость каждые 5 секунд для каждого postItem отображаемого, что быстро превратится в огромный беспорядок.

См. https://github.com/mizzao/meteor-timesync для пакета, который обеспечивает время реакции. переменные на клиенте (и они также синхронизируются с серверным временем!) Он в основном делает то, что вы хотите, но более чистым способом. (Отказ от ответственности: я написал этот пакет.)

Точно так же вы можете использовать момент для вычисления фактической отображаемой строки. Например, избавьтесь от всего остального и просто используйте

Template.postItem.posted = function() {
    return moment(this.submitted).from(TimeSync.serverTime());
}

Расширение moment().twitter() не кажется хорошим выбором, потому что оно использует только текущее время клиента и не позволяет вам передать определенное (то есть синхронизированное с сервером) время или реактивное значение.

person Andrew Mao    schedule 25.06.2014
comment
Спасибо за ответ, но я не думаю, что вы поняли мою проблему, и мне, вероятно, следовало прояснить ее. Когда сообщение сохраняется, время его создания сохраняется в представленном документе. Так что это никогда не меняется. И это хорошо: это не должно измениться. Но в то же время у меня есть функция, которая оборачивает эту дату и преобразует ее в форму timeago. Проблема, которая сейчас довольно очевидна, заключается в том, что эта функция выполняется только при отрисовке шаблона, поэтому время назад быстро становится неточным, поэтому я хотел бы, чтобы оно автоматически обновлялось, скажем, каждую минуту. - person oliv23; 26.06.2014
comment
@ oliv23 Я действительно правильно понял ваш вопрос. Я предлагаю вам отобразить переменную timeago(currentTime - creationTime), где я предлагаю использовать реактивное значение для currentTime, которое недействительно через регулярные промежутки времени, что приводит к автоматическим обновлениям строки. Библиотека, с которой я связался, обеспечивает именно это, и вы можете использовать момент, чтобы показать время назад в точном формате, который вы хотите. - person Andrew Mao; 26.06.2014
comment
Ах, хорошо, я понимаю. Более логично, чтобы функция timeago зависела от реактивного значения currentTime. Я взглянул на пакет и, насколько я понимаю, я бы использовал для этого функцию serverTime (), но как мне сказать, как часто обновлять? Я не хочу в реальном времени timeago, просто обновляю каждые 60 секунд. - person oliv23; 26.06.2014
comment
@ oliv23 Это то, что мы могли бы учесть в библиотеке, но на данном этапе это может быть преждевременной оптимизацией. Если на вашей странице нет тысяч значений timeago, вычисления обновлений с Blaze выполняются довольно быстро. Попробуйте и взгляните на диспетчер задач Chrome. Чтобы прояснить мое предложение, взгляните на приведенный выше код. - person Andrew Mao; 26.06.2014
comment
Да, тогда я не буду об этом беспокоиться. Возможно, вы когда-нибудь захотите добавить в свой пакет. В любом случае спасибо за код. На самом деле я начал с этого, и это работает, но в итоге я запек TimeSync.serverTime прямо в moment.twitter. Таким образом я получаю и реактивность, и синтаксис твиттера. - person oliv23; 27.06.2014