【问题标题】:Reactive non-mongo variable in angular-meteor角度流星中的反应性非mongo变量
【发布时间】:2015-04-08 11:30:52
【问题描述】:

我还没有找到挑战的答案或解决方案:如何在 angular-meteor 中反应性地绑定变量(会话变量,没有 mongo 集合)?

我正在从独立流星转换。在这里我可以使用 template.helper 方法。由于我不能再将模板(和 iron:router)与 angular-meteor 和 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()});
     }]);

【问题讨论】:

标签: angularjs meteor


【解决方案1】:

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

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

或者您可以使用Tracker.autorun(func),只要您使用响应式变量,即可在变量更改时响应式地重新运行函数。

【讨论】:

  • 感谢您的快速回答。我也发现了这个,它解决了这个问题:stackoverflow.com/a/21046935/4035797 虽然这两种解决方案似乎都朝着同一个方向发展 ;-)
  • 快速说明,在您提到的答案中DepsTracker 的旧名称。如果您找到了一个好的答案,请务必发布您的答案并接受它。
  • 答案是正确的,但自从新的 angular-meteor 服务以来有点过时了。请看看我的新答案。
【解决方案2】:

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

【讨论】:

  • 自从新的 angular-meteor 服务以来,这个答案有点过时了。请看看我的新答案
【解决方案3】:

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

有两种可能的解决方案:

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

  2. 如果您使用 Session 变量只是为了获得变量响应(意味着触发自动运行),您应该使用 getReactively 。这只是返回已经存在的范围变量,但每次更改时都会触发自动运行。我们的tutorial 就是一个很好的例子。

    • 注意:无论如何,当你在 Angular 中使用 Tracker.autorun 时,你需要将它连接到一个作用域。如果您将 Tracker.autorun 替换为 $meteorUtils autorun function,则可以轻松完成此操作

如果你能分享一个 repo 那就太好了,这样我就可以从更广泛的角度看待并更好地确定两者的最佳解决方案。

【讨论】:

  • 刚刚在原始问题中添加了一个代码示例。这就是我现在解决问题的方式,但我不确定,如果根据您的回答,这是否是最好的方法。任何提示? (我使用atmospherejs.com/gwendall/session-json获取/设置带有JSON数据的会话变量,交互方法获取/设置会话JSON)
猜你喜欢
  • 2023-03-16
  • 2016-12-28
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 2017-09-15
  • 1970-01-01
相关资源
最近更新 更多