2016-03-18 23 views
1

Soru sindirmek sağlar: İki kontrolörleri Köpek ve Kedi var. Eğer köpek ismini değiştirirsem, o zaman $ digest döngüsü çalışır ve Cat ayrıca {{ctrl.getTime()}} kullanımı yöntemi nedeniyle buradaki görünümü de günceller. Bu, tüm denetleyicileri yükleyen ve ng-if veya state kullanmayan büyük uygulamalar için büyük bir sorundur. Mevcut uygulamasında biz şablonları içine yöntemleri kullanmak ve ne olay kötü biz yüklemek ve tüm uygulama denetleyicileri ve ilk etabından durumlarını veya kullanmayan yerlerde bir sürü var ng-eğer, sadece ng-gösteriyi kullanın. Ben daha iyi bir çözüm özelliklerini kullanmayı ne olduğunu biliyorum, ama ben $ için açısal anlatmak yerine tüm uygulama kapsamları tek DogCtrl kapsamını sindirmek mümkün olduğunu acaba?angularjs tek geçerli kapsamı

HTML

<div ng-app="myApp"> 
    <div ng-controller="DogCtrl as ctrl"> 
     <h3>DogCtrl</h3> 
     Dog name: <input ng-model="ctrl.name" />{{ctrl.name}} 
    </div> 
    <hr /> 
    <div ng-controller="CatCtrl as ctrl"> 
     <h3>CatCtrl</h3> 
     Cat getTime: {{ctrl.getTime()}} {{ctrl.random}} 
    </div> 
</div> 

JavaScript

var myApp = angular.module('myApp',[]); 
myApp.controller('DogCtrl', DogCtrl); 
myApp.controller('CatCtrl', CatCtrl); 

function DogCtrl() { 
     this.name = 'Doggy'; 
} 

function CatCtrl() { 
     this.getTime = function() { 
      return new Date().getTime(); 
    } 
} 

Fiddle:

<div ng-controller="CatCtrl as ctrl"> 
    <h3>CatCtrl</h3> 
    Cat getTime: {{ctrl.currentTime}} {{ctrl.random}} 
</div> 

Ve t yapmak için kumandanızı değiştirin: http://jsfiddle.net/nvgofo46/1/

+0

kodunuzu biraz aşağıdaki gibi değiştirdiyseniz, temelde html üzerinde neden ctrl.getTime() 'yi kullandığını biliyorum (http://jsfiddle.net/GomesNayagam/fnqcv86j/2/ – Gomes

+0

). her zaman güncellemek istedin mi? –

+0

bazı zamanlarda @PankajParkar daha rahat yerine çok kapalı yerlerde mallarla ilgilenen bu yöntemde isActive (gibi yöntem) ve yer hesaplama mantığı var, ama bu durum için ben sadece açısal değildi CatCtrl görünümünü değerlendirmek göstermek eklendi hiç değişti. –

cevap

1

bu şekilde html değiştirme Onun adı:

function CatCtrl() { 
    this.getTime = function() { 
     return new Date().getTime(); 
    } 
    this.currentTime = this.getTime(); 
} 

Genel kural olarak, görünümünüzde işlevlere sahip olmamayı deneyin. Çünkü fonksiyonlar her sindirimde yürütülür. Bir modele bağlamak ve buna göre modelini güncelleme daha verimli.

Ben işlevini kaldırmak ile, sade set this.currentTime = new Date(). GetTime(), ama bu zaman bu çalışmanın amacı değil olabilir.

+0

Evet, haklısınız, sadece açısal her bir döngü döngüsündeki görünümlerdeki tüm işlevleri değerlendirmek için yöntem çağrısı ekledim. Belki sadece açılmış kapsamı değerlendirmek için açısal 1 söylemek mümkün değildir. Açısal 2 değişim tespiti ile ilgili iyi bir yazı okudum ve bu problemin ortadan kalktığı gibi artık sorun yok. Http://blog.thoughtram.io/angular/2016/02/22/angular-2-change-detection-explained.html –

İlgili konular