5

我正在尝试使用 Meteor 和 Angularjs。我正在使用Meteor_angularjs包,它适用于Collections.

现在我正在尝试使用Session我的反应式数据存储:

TestCtrl = [
    "$scope",
    function($scope){
        $scope.value = Session.get('someValue');
    }
]

这不起作用。

问题:关于如何绑定 MeteorSession和 Angular 的任何建议?

据我了解,我可以编写将Session每隔一段时间轮询一次的指令,但我认为这不是一个好的选择。
谢谢

更新:

我尝试了以下方法:

TestCtrl = [
    "$scope",
    function($scope){
        Meteor.autorun(function(){
            $scope.config = Session.get('testsConfig');
            if (!$scope.$$phase){
                $scope.$digest();
            }
        });
    }
]

它有点工作,但是我收到以下错误:

Error: INVALID_STATE_ERR: DOM Exception 11
Error: An attempt was made to use an object that is not, or is no longer, usable.
    at derez (http://localhost:3000/test:95:41)
    at derez (http://localhost:3000/test:95:30)
    at derez (http://localhost:3000/test:95:30)
    at derez (http://localhost:3000/test:95:30)
    at derez (http://localhost:3000/test:95:30)
    at derez (http://localhost:3000/test:95:30)
    at derez (http://localhost:3000/test:95:30)
    at derez (http://localhost:3000/test:95:30)
    at derez (http://localhost:3000/test:95:30)
    at derez (http://localhost:3000/test:95:30) angular.js:5526
$get angular.js:5526
$get angular.js:4660
$get.Scope.$digest angular.js:7674
(anonymous function) controllers.js:46
Meteor.autorun.rerun deps-utils.js:78
_.extend.run deps.js:19
Meteor.autorun.rerun deps-utils.js:78
_.extend.flush deps.js:63
_.each._.forEach underscore.js:79
_.extend.flush deps.js:61
_.each._.forEach underscore.js:79
_.extend.flush deps.js:60

更新 2:

我已经尝试过这样的服务(可能是错误的用法),仍然没有。现在它根本不会更新 Session 值的变化。

Meteor.autorun(function(){
    app.factory('ssn', function(){ return{
        get: function(val){
            return Session.get(val);
        }
    }});
});
TestCtrl = [
    "$scope","ssn",
    function($scope, ssn){
        $scope.config = ssn.get('testsConfig');
    }
]

更新 3:Angular$apply()

从角度框架之外执行角度表达式。(例如来自浏览器 DOM 事件、setTimeout、XHR 或第三方库)

同时 MeteorMeteor.render()具有

不过,大多数时候,您不会直接调用这些函数——您只会使用您最喜欢的模板包,例如 Handlebars 或 Jade。render 和 renderList 函数适用于实现新模板系统的人。

但是,似乎我不能将 2 和 2 放在一起。:(

4

3 回答 3

2

这是一个带有旧答案的老问题,但我看到人们提到它,所以这里是更新的答案。

首先 - 有一个的 angular-meteor 库可以为您处理这些情况。

这个库为您提供了两种可能的解决方案:

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

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

于 2015-02-12T03:43:50.500 回答
1

嗨,这是一个选项(可能不是最好的,但我认为它有效)

app.service('Session',function($rootScope){
    var self = this;
    self.objects = {};
    self.get = function(name){
            self.objects[name] = {"value" : Session.get(name)};
            Meteor.autorun(function() {
                    var i = Session.get(name);
                    if(self.objects[name].value != i){
                            if (!$rootScope.$$phase){
                                    $rootScope.$apply(function(){
                                            self.objects[name].value = i;
                                    });
                            }
                    }
            });
            return self.objects[name];
        }
        self.set = function(name,value){
            self.objects[name].value  = value;
            Session.set(name,value);
        }
        return self;
});

像这样在 $scope 中调用它 $scope.test = Session.get("test");

在视图中为 {{test.value}}。抱歉回复晚了 。

新年快乐!

于 2013-01-07T14:23:31.597 回答
0

尝试

angular.module('yourmod', [])
.controller('TestCtrl', ['$scope', function($scope) {
  var c = Deps.autorun(function (comp) {
     //... put reactive stuf on scope.....
     if(!comp.firstRun) {
       // only do not do aply at first run becaulse then apply is already running.
       $scope.$apply()
     }
  });

  // and to realy make it nice...
  $scope.on('$destroy', function () {c.stop()});
}])
于 2014-01-10T14:33:02.647 回答