2016-08-03 3 views
2

Я пытаюсь сделать помощник Meteor не реагирующим с этим кодом: Метеор - Tracker.nonreactive() не снимая реактивности от помощника

let titleNonReactive; 

Template.articleSubmission.onCreated(function() { 

    this.autorun(function() { 
     titleNonReactive = Template.currentData().title; 
    }); 

}); 

Template.articleSubmission.helpers({ 
    titleNonreactive: function() { 
     return titleNonReactive; 
    } 
}); 

Однако полученный вывод еще реактивный. Если я сохраню новое значение в фоновом режиме, оно автоматически обновится в интерфейсе, где я показываю результат этого помощника с {{ titleNonreactive }}.

Как это исправить?

+0

Это, вероятно, имеет отношение к вашему Blaze контекста данных; можете ли вы показать код шаблона Blaze, который ссылается на '{{title}}' и '{{titleNonreactive}}'? – hwillson

ответ

3

Это, скорее всего, вызвано контекстом данных Blaze (необходимо будет проверить, что ваш код шаблона подтвержден), но вот возможное решение, которое не связано с использованием Tracker.nonreactive. Поскольку вы хотите, чтобы значение titleNonreactive не было реактивным, вы можете просто использовать стандартную локальную/нереактивную переменную для хранения копии исходного реактивного названия. Например:

import { Template } from 'meteor/templating'; 
import { articles } from '/imports/api/articles/collection'; 
import './main.html'; 

let originalTitle; 

Template.body.onCreated(function onCreated() { 
    this.autorun(() => { 
    const article = articles.findOne(); 
    if (article && !originalTitle) { 
     originalTitle = article.title; 
    } 
    }); 
}); 

Template.body.helpers({ 
    article() { 
    return articles.findOne(); 
    }, 

    titleNonreactive() { 
    return originalTitle; 
    } 
}); 

Затем в шаблоне:

<ul> 
    {{#with article}} 
    <li>Reactive Title: {{title}}</li> 
    <li>Non-Reactive Title: {{titleNonreactive}}</li> 
    {{/with}} 
</ul> 
+0

Я не понимаю, какой синтаксис вы используете в верхней части кода. Метеор не требует импорта. И вы не можете просто объявить переменную в пустом пространстве (пусть оригинальныйTitle), насколько я знаю. – jetlej

+0

Контекст данных - это статья, поэтому я могу просто использовать {{title}} в шаблоне и захватить заголовок статьи. – jetlej

+0

Я думаю, что этот ответ правильный. Помощники всегда реагируют на контекст данных. Когда изменяется 'title', функция' Tracker.nonreactive' вызывается снова, независимо от каких-либо источников данных, доступных внутри нее. Получение данных за пределами помощника, как описано в @hwillson, работает вокруг этой проблемы. – chrisklaussner

Смежные вопросы