2016-04-07 14 views
1

私はrandomWidth()関数で2回呼び出すことに問題があります。これは、まだ2回呼び出されている要素からng-repeat属性を削除しても発生します。私はこの問題を回避する方法を考え出すことはできません。私はこれを回避する方法があると思っているのでしょうか、明らかに何かを残しているのでしょうか?AngularJSスタイルは2回実行されますか?

HTML:

<div id="body-wrapper" ng-app="gallery" ng-controller="mainCtrl"> 
<section id="sidebar"> 

    <h1>Gallery</h1> 

</section> 

<main> 
    <div class="box" ng-repeat="img in imgs" ng-style="{'width': randomWidth()}"> 
    <div class="box-wrapper"></div> 
    </div> 
</main> 
</div> 

Javascriptを:

angular.module('gallery', []) 
.controller('mainCtrl', function($scope){ 

    $scope.imgs = [ 
    { 
     title: 'image1' 
    }, 
    { 
     title: 'image2' 
    }, 
    { 
     title: 'image3' 
    }, 
    { 
     title: 'image4' 
    }, 
    { 
     title: 'image5' 
    }, 
    { 
     title: 'image6' 
    } 
    ]; 

    $scope.randomWidth = function(){ 
    const widths = ['25%', '33%', '40%', '50%']; 
    const max = widths.length; 
    const min = 0; 
    var r = Math.floor(Math.random() * (max - min)) + min; 
    console.log(widths[r]); 
    return widths[r]; 
    } 
}) 

ライブコード:http://codepen.io/daviddiefenderfer/pen/qZpqdK

+0

それが二回呼ばれていますを語っているもの私は、randomWidthが2度呼び出されているという明白な兆候は見ていません。あなたは気分をリフレッシュしましたか? –

+1

私は、各ダイジェストループでttが呼び出されると思います - コンソールのエラーを見てください。 –

+0

Alonは言うとおり、 'ng-style'が' randomWidth() 'を1回だけ評価すると間違っていると思います。これはそうではありません。 'ng-style'は、結果の値が変更された可能性があると思われる理由があるときはいつでも、それを再評価します。ランダムな幅をあらかじめ計算し、それらを修正したい場合は '$ scope'のプロパティとして割り当ててください。 – Oliver

答えて

3

これはcodepen更新を参照してください - あなたは一度画像につき、あなたのJSにrandomWidthを呼び出す必要があります。あなたが設定したやり方では、最初に呼ばれ、ダイジェストサイクルをトリガーする要素を修正し、randomWidthなどの呼び出しをトリガーします。これは、無限ループを検出するためAngularが停止するまで続きます。

http://codepen.io/lwalden/pen/KzZWXK

HTMLに変更:JSへ

<div class="box" ng-repeat="img in imgs" ng-style="{'width': img.style}"> 

変更:?

angular.module('gallery', []) 
.controller('mainCtrl', function($scope){ 

    $scope.randomWidth = function(){ 
    const widths = ['25%', '33%', '40%', '50%']; 
    const max = widths.length; 
    const min = 0; 
    var r = Math.floor(Math.random() * (max - min)) + min; 
    console.log(widths[r]); 
    return widths[r]; 
    } 

    $scope.imgs = [ 
    { 
     title: 'image1', 
     style: $scope.randomWidth() 
    }, 
    { 
     title: 'image2', 
     style: $scope.randomWidth() 
    }, 
    { 
     title: 'image3', 
     style: $scope.randomWidth() 
    }, 
    { 
     title: 'image4', 
     style: $scope.randomWidth() 
    }, 
    { 
     title: 'image5', 
     style: $scope.randomWidth() 
    }, 
    { 
     title: 'image6', 
     style: $scope.randomWidth() 
    } 
    ]; 
}) 
+1

Spot on!しかし、おそらくビューに必要な変更も加えてください。 –

+0

まさに私が探していたもの、ありがとう! –

1

私はこの質問はすでに十分answeredをされていると思います。

このarticle$digestでご覧になることをお勧めします。

Note: At a minimum, $digest will run twice even if your listener functions don’t change any models. As discussed above, it runs once more to make sure the models are stable and there are no changes.

+0

例外として、コード例の 'infdig'エラーは、' randomWidth() 'のランダムな結果で2つの後続のダイジェストが決して安定しないため、無限のダイジェストがあることを意味します。 – Oliver

+0

この記事へのリンクをありがとう、それは今なぜ機能を2回実行していたのでしょうか。 –

関連する問題