2016-07-28 3 views
1

私のアプリケーションのパフォーマンスを最適化したい。私は次の問題を見つけました。私は(1つのオブジェクト内に変更はありません)複数の​​キーを持つオブジェクトおよびこれに類似した見解を持ってみましょう:オブジェクトプロパティの角型ワンタイムバインディング

<div ng-if="vm.model"> 
    <span>{{ vm.model.property1 }}</span> 
    <span>{{ vm.model.property2 }}</span> 
    <span>{{ vm.model.property3 }}</span> 
</div> 

私は私の性質のためのワンタイムバインディングを使用するように思っているだろうが、私は、VMを変更した場合モデルを偽の値に明示的に変更し、何らかの方法でダイジェストサイクルをトリガーしてブロック全体を強制的に削除しない限り、ビュー内で私の式は更新されませんその後、再コンパイルされます。

これらのプロパティは監視されるべきではなく、親オブジェクトの参照のみが必要であるため、これらの3つの冗長ウォッチャーを避ける方法はありますか?

答えて

0

https://docs.angularjs.org/guide/expression

問題がAngularJSとは関係ありません、あなたの問題の私の理解に基づいていますが、JavaScriptがに渡された参照でどのように機能するかについて、そのポイントこの

<div ng-if="vm.model"> 
    <span>{{ ::vm.model.property1 }}</span> 
    <span>{{ ::vm.model.property2 }}</span> 
    <span>{{ ::vm.model.property3 }}</span> 
</div> 
+0

私はすでに、私はここにワンタイムバインディングを使用することができないと述べ、その理由を説明してきました。たとえば、directive link関数内でscope.vm.model = {...}を実行すると、それらの式は更新されません。 –

0

@Alexey Katayevをお試しください機能。

この投稿はIs JavaScript a pass-by-reference or pass-by-value language?と以下の簡単な例で確認してください。あなたの問題を解決するために役立つことを願っています。

angular 
 
    .module('demo', []) 
 
    .controller('DefaultController', DefaultController); 
 
    
 
    function DefaultController() { 
 
    var vm = this; 
 
    vm.model = data[0]; 
 
    
 
    vm.changeModel = changeModel; 
 
    
 
    function changeModel(model) { 
 
     model.property1 = data[1].property1; 
 
     model.property2 = data[1].property2; 
 
     model.property3 = data[1].property3; 
 
    } 
 
    } 
 
    
 
    var data = [ 
 
    { property1: 'Property 1', property2: 'Property 2', property3: 'Property 3' }, 
 
    { property1: 'Property 4', property2: 'Property 5', property3: 'Property 6' }, 
 
    { property1: 'Property 7', property2: 'Property 8', property3: 'Property 9' } 
 
    ]; 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="demo"> 
 
    <div ng-controller="DefaultController as vm"> 
 
    <button type="button" ng-click="vm.changeModel(vm.model)">Change Model</button> 
 
    
 
    <div ng-if="vm.model"> 
 
     <span>{{ vm.model.property1 }}</span> 
 
     <span>{{ vm.model.property2 }}</span> 
 
     <span>{{ vm.model.property3 }}</span> 
 
    </div> 
 
    </div> 
 
</div>

+0

私の目標はウォッチャーの数を減らすことでしたが、これはあなたのコードでどのように達成されましたか?私の例と同じに見える –

+0

ビュー内の式が更新されていないと言っているように、vm.model(パラメータとして渡される)を関数内の別のオブジェクトに直接割り当てていますか?このhttps://jsfiddle.net/tkv1eodg/のように、これはパラメータには影響しません.vm.modelがパラメータを渡すのではなく関数で直接使用されている場合は、ビューを更新します。このhttps:// jsfiddleを参照してください。 net/tkv1eodg/1 /その他の場合、パラメータのプロパティが更新されている場合、ビューは上記の埋め込みコードスニペットに示すように更新されます。 –

関連する問題