角度流星中的反应性非mongo变量

时间:2015-02-08 18:27:25

标签: angularjs meteor

我还无法找到答案或解决方案:如何在角度流星中反应性地绑定变量(会话变量,没有mongo集合)?

我是从独立流星转换而来的。在这里,我可以使用template.helper方法。因为我不能再使用角度流星和angularui-router的模板(和铁:路由器),我不能再与助手结合反应(至少在我的理解中)。

我在流星角度控制器中尝试了这个,它属于一个sentence.tpl文件:

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

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

令牌化工作(我可以在调试器中看到它),但只有在我重新加载页面时才会显示该值。我想要实现的是将字符串从输入字段标记为JSON表示(标记化器处理它)并以结构化方式从JSON表示中同样地显示它(单独的html输入元素,它们是动态创建的)。 sentence_type是应该在html页面上使用的变量,用于显示和更改句子类型,在输入时可以更改。

有人有一些提示吗?也许,我也可以使用一些我不知道的Angular功能?

干杯, 扬

代码回购:

我目前的代码如下:

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()});
     }]);

3 个答案:

答案 0 :(得分:1)

要使用reactive variables,您需要reactive computation。您可能需要使用Tracker.autorun

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

或者,当变量发生变化时,无论何时使用反应变量来反复重新运行函数,都可以使用Tracker.autorun(func)

答案 1 :(得分:1)

好问题和最佳答案取决于您的需求。

有两种可能的解决方案:

  1. 如果要将Session变量绑定到范围变量,请使用$meteorSession服务。 它的作用是每次范围变量发生变化时,它都会变为Session变量(如果它置于一个变量内,则触发自动运行)。 每当Session变量发生变化时,范围变量也会发生变化(并改变它所放置的视图)。

  2. 如果您正在使用Session变量来获取变量被动(意味着触发自动运行),则应使用getReactively。这只返回已存在的范围变量,但每次更改时都会触发自动运行。我们可以在tutorial找到一个很好的例子。

    • 注意:无论如何,当你在Angular中使用Tracker.autorun时,你需要将它连接到一个范围。如果您使用$meteorUtils autorun function
    • 替换Tracker.autorun,则可以轻松完成此操作
  3. 如果您可以分享回购协议以便我可以从更广泛的角度看待并且可以更好地确定两者中最佳解决方案,那将会很棒。

答案 2 :(得分:0)

基于关于"会话"的另一个答案可靠性,我可以解决问题。只需使用链接https://stackoverflow.com/a/21046935/4035797中描述的方法即可。您必须使用Tracker.autorun替换Deps.autorun,因为Deps已被弃用,您必须使范围变量在模板中被使用(例如,$ scope.sentence_type = Session.getJSON(" current_sentence.sentence_type&#) 34;);)而不是标记器。