2

$scope.list新しいレコードが db/collection に追加されたとき に更新/更新する方法 -storage.set()メソッド - コード内のコメントを参照してください。

以下のコードを参照してください。

angular.module("app", [])

.factory('Storage', function() {

    var storage =  {};
    storage.get = function() {
        return GetStuffHere();
    }
    storage.set = function(obj) {
        return SetStuffHere(obj);
    }
    return storage;
})
.controller("MainCtrl", function($scope, Storage) {

    $scope.addStuff = function(){

        var obj = {
            "key1" : "data1",
            "key2" : "data2"
        };
        Storage.set(obj);
       // update $scope.list here, after adding new record
    }
    $scope.list = Storage.get();

});
4

6 に答える 6

6

受信したデータを配列としてサービスに格納するアプローチを次に示します。サービス内の promise を使用して、以前に保存された配列 (存在する場合) を送信するか、HTTP 要求を作成して応答を保存します。$http の promise を使用して、新しく格納された配列を返します。

これにより、格納された配列を他のコントローラーまたはディレクティブ間で共有できるようになりました。追加、編集、または削除するときは、サービスに格納されている配列で実行されるようになりました。

app.controller('MainCtrl',function($scope, Storage){
  Storage.get(function(data){
    $scope.items=data
  });

  $scope.addItem=function(){
    Storage.set({name: 'Sue'});
  }
})

app.factory('Storage', function($q,$http) {

    var storage =  {};
    storage.get = function(callback) {
      /* see if already cached */
      if( ! storage.storedData){
        /* if not, get data from sever*/
        return $http.get('data.json').then(function(res){
          /* create the array in Storage that will be shared across app*/
          storage.storedData=res.data;
          /* return local array*/
          return storage.storedData
        }).then(callback)
      }else{
        /* is in cache so return the cached version*/
        var def= $q.defer();
        def.done(callback);
        defer.resolve(storage.storedData);
        return def.promise;
      }


    }
    storage.set = function(obj) {
     /* do ajax update and on success*/
        storage.storedData.push(obj);
    }
    return storage;
})

DEMO

于 2013-11-12T14:47:00.230 に答える
1

以下の解決策が機能します。ただし、これを関数に入れて必要に応じて呼び出すことがベストプラクティスであるかどうかはわかりません(内MainCtrl):

すなわち:

  • 最初のロード時
  • そして、新しいアイテムが追加された後

    .controller("MainCtrl", function($scope, Storage) {
    
    $scope.addStuff = function(){
    
        var obj = {
            "key1" : "data1",
            "key2" : "data2"
        };
    
        Storage.set(obj);
    
        // rebuild $scope.list after new record added
        $scope.readList();
    
    }
    
    // function to bind data from factory to a $scope.item
    $scope.readList = function(){
        $scope.list = Storage.get();
    }
    
    // on first load
    $scope.readList();
    
    });
    
于 2013-11-12T13:55:32.220 に答える
0

バックエンド/Factory のものを更新することは、set/post サービスを呼び出すことによって行われる基本的な Angular バインディングです。ただし、ファクトリで発生した変更に基づいてコントローラー変数 ($scope.list) を自動的に更新する場合は、プーラーのような関数を作成し、次のようにする必要があります。

.run(function(Check) {});

.factory('Storage', function() {

     var storage =  {};

     var Check = function(){
           storage = GetStuffHere();
           $timeout(Check, 2000);
     }

    // set...

    Check();
    return storage;

 })

 .controller("MainCtrl", function($scope, Storage) {

     $scope.list = Storage.storage;
于 2013-11-12T14:25:18.073 に答える