2016-08-08 5 views
0

この単純な関数を使用して、製品をそれぞれのカテゴリにグループ化します。私はタイムアウト内で関数を呼び出すことがわかります。AngularJSの関数から生成された後、ビューに配列が表示されない

問題は、console.log()のように動作しても、私の見解では何も見ることができません。私の見解で

function sortByCategories(){ 
     var temp = []; 
     angular.forEach(admin.categories, function(category, value){ 
      angular.forEach(admin.products, function(product, value){ 
       angular.forEach(product.categories, function(prodCat, value){ 
        if(prodCat.text == category.text) 
        { 
         if(!temp[category.text]) 
         { 
          temp[category.text] = []; 
         } 

         temp[category.text].push(product); 
        } 
       }) 
      }) 
     }) 
     admin.sortedProducts = temp; 
    } 

    $timeout(function(){ 
     sortByCategories(); 
     console.log(admin.sortedProducts); // This shows me what I expect. 
    }, 3500); 

私のHTMLは、単に私が私の見解で見るすべては、私が何をしないのです[]

あるだけ<pre>{{admin.sortedProducts | json}}</pre>

のですか?

UPDATE

私はサービスにこの機能を移動し、私のルートで解決としてそれを置きました。私はまだ同じ問題に直面しています。ここに私が持っているものがあります。

.factory('Products', function($rootScope, $timeout, $q, fbUrl, $firebaseArray){ 
    return { 
     sortByCategories: function() { 
      var temp = []; 
      var deferred = $q.defer(); 
      var ref = new Firebase(fbUrl); 
      ref.once('value', function(snapshot){ 
       var categories = snapshot.child('categories').val(); 
       var products = snapshot.child('products').val(); 

       angular.forEach(categories, function(category, value) { 
        angular.forEach(products, function(product, value){ 
         angular.forEach(product.categories, function(prodCat, value){ 
          if(prodCat.text == category.url) 
          { 
           if(!temp[category.url]) 
           { 
            temp[category.url] = []; 
           } 

           temp[category.url].push(product); 
          } 
         }) 
        }); 
       }); 
       deferred.resolve(temp); 
      }) 
      return deferred.promise; 
     } 
    } 
}) 

そして

その後、私のルートに私は決意でこれを持っている。そして、

... 
resolve: { 
    categorySortedProducts : function(Products){ 
     return Products.sortByCategories(); 
    } 
} 
... 

それは私のコントローラにロードされています

.controller('productsCtrl', function($scope, categorySortedProducts){ 

    var admin = this; 

    $scope.sortedProducts = categorySortedProducts; 

    console.log($scope.sortedProducts); 


    ... 

}) 

(方法によってはconsole.log作品^^ !)

最後に私のHTMLビューでは、私は単にこれを持っています:

<pre>{{sortedProducts | json}}</pre> 

私のルートにコントローラがロードされていて、管理者としてロードされています。 (productsCtrlを管理者)。

UPDATE 2

だからそれは一種の奇妙である)はconsole.log(のように見えます。これは、次のようになります。

Array[0] 
    category-one[12] 
    categroy-two[15] 

これは、親がArray [0]を表示するためには正常ですか?ただ問題を見つけようとしています。

答えて

0

あなたのビューはスコープを見ていますが、admin変数はローカルで定義されており、Angularのスコープには添付されていません。

があなたのコードを変更し

$scope.admin.sortedProducts = temp; 

を、なぜそれがあなたのビューでconsole.logずに働くのですか?ビューはコントローラのスコープを調べているためです。しかし、あなたのconsole.logはAngularのスコープ上にある必要はないローカル名前空間を探していました。

+0

私は同じことを考えましたが、OPはcontrollerAs構文を使用していて、 'admin'は実際には' this'へのローカル参照です。何か他のことは明らかに進んでいますが、コードの一部が掲載されているため、診断される可能性は低いです。 – Lex

+0

私の質問が更新されました。もう一度見てください。 –

+0

@Lex私はあなたに何を与えるより多くのコードがわからない。 –

1

私の約束は以下のように変更されました。

var temp = {}; 

var temp = []; 

そして今、すべてが私のビューに表示されます。私のデータは、通常は[]のように順番に設定されていないため、推測しています。

関連する問題