метеор: сделать параметр внешнего скрипта реактивным

В моем приложении-метеоре есть кнопка для перехода из режима просмотра пользователя в режим редактирования. В этой части я использую JointJS как внешний пакет для отображения и редактирования диаграмм. (api.use('mxmxmx:[email protected]');)

В пользовательском представлении диаграмма не должна быть редактируемой. Итак, я хочу переключить interactive с true на false и наоборот.

Но в моей попытке переменная не является реактивной: Session.set('editor', true) не меняет вид сразу. Мне нужно перезагрузить страницу, чтобы увидеть новый вид.

Как я могу сделать это реактивным?

var graph = new joint.dia.Graph;

Template.jointjs.onRendered(function() {

    var interactive = Session.get('editor') ? true : false;
    var paper = new joint.dia.Paper({
        el: $('#canvas'),
        width: 801,
        height: 496,
        model: graph,
        interactive: interactive,
    });

});

<template name="jointjs">
    <h1>{{diagram.title}}</h1>
    <div id="canvas"></div>
</template>

Обновить

Это тоже не работает, так как интерактивная переменная просто вступает в силу, перезагружая страницу:

Tracker.autorun(function() {
    var interactive = Session.get('editor') ? true : false;
    var paper = new joint.dia.Paper({
        el: $('#canvas'),
        width: 801,
        height: 496,
        model: graph,
        interactive: interactive
    });
});

person user3142695    schedule 23.10.2015    source источник
comment
оберните свой код в autorun и перезапустите при изменении сеанса   -  person Mark Uretsky    schedule 23.10.2015
comment
@MarkUretsky: тоже не работает.   -  person user3142695    schedule 23.10.2015


Ответы (1)


Чтение документации сообщает нам, что мы можем передать функцию параметру interactive:

  • интерактивный - если установлено значение false, взаимодействие с элементами и ссылками отключено. Если это функция, она будет вызываться с представлением ячейки в действии и именем метода, в котором она оценивается ("pointerdown", "pointermove", ...). Если возвращаемое значение такой функции равно false, взаимодействие будет отключено для действия. Для ссылок существуют специальные свойства объекта взаимодействия, которые полезны для отключения поведения по умолчанию. Этими свойствами являются: vertexAdd, vertexMove, vertexRemove и arrowheadMove. Установив для любого из этих свойств значение false, вы можете отключить соответствующее действие по умолчанию для ссылок.

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

Session.set('CanEdit', правда)

interactive: function(cellView) {
  return Session.get('CanEdit');
}

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

person JeremyK    schedule 23.10.2015
comment
Может быть, я вас неправильно понимаю. Поскольку пользователь может динамически изменять представление без перезагрузки, я думаю, что мне нужна реактивность. И это не делается функцией, так как эта функция будет вызываться только один раз изначально - person user3142695; 23.10.2015
comment
мое понимание выделенного выше раздела заключается в том, что функция будет вызываться в обработчиках событий pointerdown, pointermove и т. д. Таким образом, функция будет выполняться каждый раз, когда пользователь пытается отредактировать диаграмму. - person JeremyK; 23.10.2015
comment
Идеально. Спасибо. Я понял эту часть по-другому. - person user3142695; 23.10.2015