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:

このようなサービスを試してみましたが(間違った使い方かもしれません)、まだ何もありません。これで、セッション値の変更がまったく更新されなくなりました。

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 用の新しいライブラリがあります。

そして、このライブラリは 2 つの解決策を提供します。

  1. セッション変数をスコープ変数にバインドする場合は、$meteorSessionサービスを使用します。それが行うことは、スコープ変数が変更されるたびに、それがセッション変数に変更されることです (そして、それが 1 つの中に置かれている場合は自動実行をトリガーします)。また、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 に答える