2017-06-18 13 views
1

ここでは単純なタスクですが、間違いについてはわかりません。AngularJSサービスを使用しているコントローラ間でデータを共有し、更新を監視する

マイサービス:

app.factory('Progress', function() { 

    var data = { 
     progressPercentageLoaded: 0 
    }; 

    return { 
     getProgress: function() { 
      return data.progressPercentageLoaded; 
     }, 
     setProgress: function (progress) { 
      data.progressPercentageLoaded = progress; 
     } 
    }; 
}); 

私は、ファイルをアップロードされたコントローラが1つ、これは進行値を設定します。

//in my controller 
$scope.progressPercentageLoaded = {progress:0}; 
//a few lines down 
function (evt) { 
console.log(evt); 
$scope.progressPercentageLoaded.progress = evt.loaded; 
Progress.setProgress($scope.progressPercentageLoaded.progress); 

私の第二のコントローラは単に、変更のためのサービスを見て、ビューを更新するが、私は、アップロードが起こっている確認し、そのevt.loadedが変化しているにもかかわらず、それがゼロで立ち往生したまま必要があります。前記第二のコントローラである

$scope.progress = 0; 
$scope.$watch(function() { return Progress.getProgress(); }, function (newValue, oldValue) { 
     if (newValue !== oldValue) { 
      $scope.progress = Math.min(100, parseInt(100 * newValue/$scope.size)); 
      if($scope.progress == 100) 
      { 
       $scope.progressModalInstance.close(); 
       window.location.reload(); 
      } 
     } 
    }); 

$scope.progressは、第1のコントローラにおけるevt.loadedの値で更新する必要があり、それはありません。

ご指摘いただきありがとうございます。

EDIT:私もtrueように、第3 watchのパラメータを追加しましたが、それはどちらかの助けにはなりませんでした。

EDIT 2:実際に上記のコードは、私の知る限りに働くは、私はそれが突然、何かが私は答えに起因して、それを編集した後、上記のコードを元に戻すときのような問題を引き起こしていたと考えていますそれが必要なように働いた。これにつきましては申し訳ございません。 $ rootScopeを使用して

+0

コンソールにエラーがありますか?これらのコントローラは互いに継承していますか?私は2つのコントローラーで簡単な例を作成し、ウォッチャーが実行されていることを確認します。しかし、ファイルをアップロードする代わりに、私は 'setProgress'を2秒ごとに呼び出しました:' var p = 0;これはあなたのために機能しますか?setInterval(function(){$ scope. $ apply(function(){Progress.setProgress(++ p);});} –

+0

@FrankModica上記のコードは実際に動作しますが、なぜ以前は動作していなかったのかわかりませんが、私はちょうど上記に戻り、うまく機能します。アップロードイベントが記録されているのを確認しましたが、アップロードの割合は変更されていませんでした。私は確信していませんが、ちょっとしたファイルを試してみましたが、上記のコードを変更せずにビューが適切に更新されました。あなたの時間を無駄にしてしまいました! :( –

+1

問題ありません、うれしいことです:) –

答えて

1

。$放送ではなく 何かを見て使用する2番目のコントローラでは、この

app.factory( '進歩'、関数($ rootScope){

var data = { 
    progressPercentageLoaded: 0 
}; 

    return { 
     getProgress: function() { 
      $rootScope.$broadcast('Event'); 
      return data.progressPercentageLoaded; 
     }, 
     setProgress: function (progress) { 
      data.progressPercentageLoaded = progress; 
     } 
    }; 
}); 

のためのより良い動作しますあなたはすべての時間を更新しているInt値を見ているので、

$rootScope.$on('Event', function(){ 
    //your logic here 
}) 
+0

可能であれば、私は '時計'を付けたいと思っています。 –

1

のようにあなたは、参照を失っていますしたがって、参照を変更しています。あなたは全体のオブジェクトprogressPercentageLoadedを見なければなりません。

同等性チェックがangular.equalsになるように、$watch関数の最後のパラメータとしてtrueを渡す必要があります。それ以外の場合は、参照平等のみがチェックされます。

+0

あなたが言っていることを理解していますが、この変更を行うコードのどこに...私は 'Progress.getProgress();'だけを見て、 'data.progressPercentageLoaded ;「私はまだ同じ問題があります! –

+0

@SummerDeveloper私は私の答えを編集して、それをチェックアウトします。 – mattias

+0

私は最後のパラメータとして 'true'を持っていますが、それでも動作しません。 –

1

私は100%確実ではありませんが、Angularはファイルのアップロードイベントを認識していない可能性があります。 $applyに電話してみてください:

$scope.$apply(function() { 
    Progress.setProgress($scope.progressPercentageLoaded.progress); 
}); 
+0

私はこれが事実だと思っていましたが、これまでに試してみましたが、今は問題を解決できませんでした。 :( –

関連する問題