Angularjs和流星“会议”的反应,有没有办法?(Angularjs and Meteor “S

2019-08-04 23:50发布

我试图用流星和Angularjs工作。 我使用Meteor_angularjs包,它可与OK Collections

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

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

这是行不通的。

问:如何牵制流星的任何建议Session和角?

据我了解,我可以写指令,将轮询Session几乎每ofter,但我不认为这是一个不错的选择。
谢谢

更新:

我已经试过如下:

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:

我已经试过这样的服务(可能是错误的用法),仍然一无所获。 现在,它不会对会话值的变化在所有更新。

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:角已经$apply()

从角框架的外侧角执行的表达式。 (例如,从浏览器的DOM事件,setTimeout的,XHR或第三方库)

同时流星有Meteor.render()

大部分时间,但是,你不会直接调用这些函数 - 你只用你喜欢的模板包,如把手或翡翠。 渲染和renderList功能适用于正在实施新的模板系统的人。

然而,好像我只是不能把2和2在一起。 :(

Answer 1:

这与旧的答案一个老问题,但我看到有人提到它,因此这里是更新的答案。

首先-有一个新的图书馆对角流星,处理这些案件为您服务。

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

  1. 如果你想一个会话变量绑定到范围变量,使用$ meteorSession服务。 它所做的是,每一个范围的变量会发生变化的时候,它会变成Session变量(如果它里面放置一个触发自动运行)。 和每一个会话变量将改变时间,范围变量会改变以及(和改变视图,它的放置在)。

  2. 如果您使用的是Session变量只是为了获得一个变量反应(指触发自动运行),你应该使用getReactively 。 这只是返回已经存在的范围变化,但每次发生变化时触发自动运行。 一个很好的例子可以发现我们的教程 。

    • 注意:无论如何,当您使用Tracker.autorun里面角,你需要将它连接到一个范围。 这可以,如果你用替换Tracker.autorun轻松完成$ meteorUtils自动运行功能


Answer 2:

你好这里是一个选项(可能不是最好的,但它的作品,我认为)

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.test = Session.get(“测试”)的$范围是这样;

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

新年快乐!



Answer 3:

尝试

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


文章来源: Angularjs and Meteor “Session” reactivity, is there a way?