2015-02-08 3 views
0

Я не мог найти ответ или решение проблемы: как я могу привязать переменную (переменная сеанса, не коллекцию mongo) реактивно в угловом метеор?Реактивная переменная non-mongo в angular-meteor

Я перехожу из автономного метеор. Здесь я мог бы использовать метод template.helper. Поскольку я больше не могу использовать шаблоны (и железо: маршрутизатор) с угловым метеорным и угловым маршрутизатором, я больше не могу связывать реактивность с помощником (по крайней мере, в моем понимании).

Я попробовал это в метеоритный-угловой контроллер, который принадлежит к sentence.tpl файла:

$scope.parsestring = function(input_string){ 
      tokenizer(input_string); 
     }; 

$scope.sentence_type = Session.getJSON("current_sentence.sentence_type"); 

Tokenizing работает (я могу увидеть его в отладчике), но отображается только значение, когда Я перезагружаю страницу. То, что я хочу достичь, - это токенизация строки из входного поля в представление JSON (этот токенизатор позаботится об этом) и отображает его по аналогии с представлением JSON структурированным способом (отдельные элементы ввода html, которые создаются динамически). Функция_предложения - это переменная, которая должна использоваться на html-странице для отображения и изменения типа предложения, который может меняться при наборе текста.

У кого-нибудь есть подсказки? Может быть, я мог бы также использовать некоторую функцию Angular, которую я не знаю?

Приветствия, Jan

Код Репо:

Мой текущий код выглядит следующим образом:

My code looks similar to this: 
angular.module('ngaignt').controller("InteractorCtrl", ['$scope', '$meteor', '$meteorCollection', 
     function ($scope, $meteor, $meteorCollection) { 
     // Autorun is necessary to make reactive variables out of the JSON returns 
      var c = Tracker.autorun(function (comp) { 
      $scope.verb_type = Session.getJSON("current_verb.type"); 
      $scope.object_type = Session.getJSON("current_object.type"); 
      $scope.verb_attributes = _.toArray(Session.getJSON("current_verb.attributes")); 
      $scope.object_attributes = _.toArray(Session.getJSON("current_object.attributes")); 

      if (!comp.firstRun) { 
       // only do not do aply at first run becaulse then apply is already running. 
       $scope.$apply(); 
      } 
     }); 

     $scope.parsestring = function (input_string) { 
      interactor(input_string); 
     }; 
     //$scope.on('$destroy', function() {c.stop()}); 
    }]); 
+0

Я видел, что существует метод getReacivity (http://angularjs.meteor.com/api/getReactively), но он все еще нуждается в коллекции. – jacques

+0

getReactively может принимать любую переменную $ scope, будь то объект или массив – Urigo

+0

Возможный дубликат сессии [Angularjs and Meteor «Session», есть ли способ?] (Http://stackoverflow.com/questions/14073306/angularjs-and- метеор-сессия-реактивность-есть-там-путь) –

ответ

1

reactive variables Для использования, вам нужно reactive computation. Вам может понадобиться использовать Tracker.autorun:

$scope.parsestring = Tracker.autorun(function(someStringInSession){ 
     tokenizer(Session.get(someStringInSession)); 
}); 

Или вы можете использовать Tracker.autorun(func) везде, где вы используете реактивную переменную реактивно перезапускать функцию, когда переменная изменяется.

+0

Спасибо за быстрый ответ. Я также нашел это, что решило проблему: http://stackoverflow.com/a/21046935/4035797 Оба решения, похоже, идут в одном направлении:;) – jacques

+0

Быстрое замечание, в ответе, который вы упомянули, 'Deps' is старое название «Tracker». Обязательно отправьте свой ответ и примите его, если вы нашли хороший. –

+0

Ответ верен, но немного устарел с момента появления новых угло-метеорных сервисов. Пожалуйста, взгляните на мой новый ответ. – Urigo

0

Основываясь на другом ответе о «сеансовой» реактивности, я мог бы решить проблему. Просто используйте подход, описанный в ссылке https://stackoverflow.com/a/21046935/4035797. Вы должны заменить Deps.autorun на Tracker.autorun, но поскольку Deps устарел, и вы должны сделать переменные области для использования в шаблоне реактивными (например, $ scope.sentence_type = Session.getJSON ("current_sentence.sentence_type");) а не токенизатор.

+0

Этот ответ немного устарел со времени нового обслуживания угловыми метеоритами. Пожалуйста, взгляните на мой новый ответ – Urigo

1

Хороший вопрос и лучший ответ в зависимости от ваших потребностей.

Есть 2 возможных решения:

  1. Если вы хотите, чтобы связать переменную Session переменной области, следует использовать $meteorSession службу. Что он делает, так это то, что каждый раз, когда изменяется переменная области видимости, она меняется на переменную Session (и запускает автозапуск, если она помещена внутри одного). и каждый раз, когда переменная Session изменится, переменная области также изменится (и измените представление, на которое оно было установлено).

  2. Если вы используете переменную Session только для того, чтобы получить переменную реактивную (что означает запуск автозапуска), вы должны использовать getReactively. это просто возвращает уже существующую переменную области, но запускает автозапуск каждый раз, когда он изменяется. хорошим примером этого можно найти наш tutorial.

    • Примечание: В любом случае, когда вы используете Tracker.autorun внутри Angular, вам необходимо подключить его к области. это можно легко сделать, если заменить Tracker.autorun с $meteorUtils autorun function

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

+0

Просто добавил образец кода к исходному вопросу. Вот как я решил проблему сейчас, но я не уверен, если это лучший способ в соответствии с вашим ответом. Любые подсказки? (Я использую https://atmospherejs.com/gwendall/session-json для получения/установки переменной сеанса с данными JSON, метод взаимодействия получает/устанавливает сеанс JSON) – jacques

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