2017-04-08 7 views
0

タイマーイベントの関数として更新する配列内のいくつかのアイテムを取得しようとしています。しかし、私はノックアウトの方法について私の心を包むことはできません...もっと私は少しノックアウト自分自身を感じる。knockoutjsを使用して配列内のアイテムに計算値を作成

問題私は単純だと思っていますが、おそらく私のアプローチは間違っているかもしれません。あるいは単に私が得られないものがあります。

もう少し詳しいことには:

配列内の項目はそれぞれ、(あなたが見ることができるように、私はko.computedに結合した、サーバーからリロード防ぐために、「何か」からの時間を表しますitems.timeElapsedを取ると、ページがロードされてからの時間を追加し、self.moreTimeElapsed(ことになっていた私が定義されているディスプレイ)機能、)

HTML:

<div> 
    <ul data-bind="foreach: counted"> 
     <li><span data-bind="text: name"></span> - <span data-bind="text: display"></span></li> 
    </ul> 
</div> 

とのViewModel

<script type="text/javascript"> 
    function myViewModel() { 
     var self = this; 

     self.email = '[email protected]'; 

     var d = new Date(); 
     self.startTime = d.getTime(); 
     self.moreTimeElapsed = ko.observable(0); 

     var items = [{"name":"counter1","timeElapsed":168},{"name":"counter2","timeElapsed":162}]; 
     for (i = 0; i < items.length; ++i) 
     { 
      items[i].display = ko.computed(function() 
      { 
       return items[i].timeElapsed + self.moreTimeElapsed(); 
      }) 
     } 
     self.counted = ko.observableArray(items); 
     self.updateCounters = function() { 
      var d = new Date(); 
      self.moreTimeElapsed(d.getTime() - self.startTime); 
     } 
     setInterval(self.updateCounters, 3000); 
    }; 

    ko.applyBindings(new myViewModel()); 
    function Reload() { 
     location.reload(true); 
    } 
</script> 

ヒントやアイデアが高く評価されました。

答えて

3

問題は、カウンター 'i'が有効範囲外になっていたことです。

私はクロージャ内のコードを包み、それが問題

var items = [{"name":"counter1","timeElapsed":1706},{"name":"counter2","timeElapsed":1700}]; 

    var attachDisplayFunc = function(item) { 
     item.display = ko.computed(function() { 
      return item.timeElapsed + self.moreTimeElapsed(); 
     }) 
    } 

    for (i = 0; i < items.length; ++i) { 
     attachDisplayFunc(items[i]); 
    } 
    self.counted = ko.observableArray(items); 

..だから、このよう誤差を作るときに通知を取得するためにどのような方法があるの解決?

+1

まあ...いいえ。しかし、私はあなたが孤立した機能を定義することによってあなたの問題を解決したことをうれしく思います。これは、愚かなIIFEハックを使うよりもはるかに優れています。これはまさにこの問題を解決するために導入された 'let'キーワードが不必要な理由です。 – Redu

関連する問題