2014-11-18 11 views
18

Ben İyonik kullanıyorum ve verilere dayanarak bir <ion-list> öğesindeki her öğenin arka plan rengini dinamik olarak değiştirmek istiyorum. Ben Bu konsol denetimini mevcutBir işlev çağrısı kullanarak ng-sınıfını kullanma - birden çok kez çağrılan

.controller('AllCasesCtrl', ['$scope', '$log', 'dummyData', function($scope, $log, dummyData) { 
    $scope.allCases = dummyData.cases; 

    $scope.getBackgroundColour = function(singleCase){ 

     $log.log("getBackgroundColour called...singleCase type: " + singleCase.speciality); 

     var colourMap = { 
     speciality1: "speciality1Class", 
     speciality2: "speciality2Class", 
     speciality3: "speciality3Class" 
     }; 

     return colourMap[singleCase.speciality]; 
    }; 

    }]) 

de denetleyici olan

<ion-list> 
    <ion-item ng-repeat="singleCase in allCases" ng-class="getBackgroundColour(singleCase)" class="item-avatar"> 
    <h2>{{singleCase.date}}</h2> 
    <p>{{singleCase.caseType}}</p> 
    </ion-item> 
</ion-list> 

doğru sınıf dönmek için bir işlev çağrısı yoluyla bunu düşündüm, getBackgroundColour() işlevi 7 çağrıldığını Listede her bir <ion-item> için zaman. Neden bu ve ng-class numaralı telefondan bir işlev çağrısı kullanmam gerekir?

cevap

23

angularjs dirty checking çalışır: o yeni bir değer dönmez o ve DOM güncellenmesine gerek olmadığından emin olmak için fonksiyonunu her döngüsü aramak gerekir.

Bu, çerçevenin tipik işleminin bir parçasıdır ve sizinki gibi bir işlevi çağırmak, herhangi bir olumsuz performans etkisi olmamalıdır. Kodunuzun okunabilirliği ve test edilebilirliği burada çok daha önemlidir, bu nedenle kontrol cihazınızdaki mantığı koruyun. gidip bu konuda okumak zorunda kalacak,

var colourMap = { 
    speciality1: "speciality1Class", 
    speciality2: "speciality2Class", 
    speciality3: "speciality3Class", 
}; 

$scope.getBackgroundColour = function(singleCase) { 
    return colourMap[singleCase.speciality]; 
}; 
+0

100 tane elemanım olduğunu varsayalım, işlevimi çağıracağım 100 * 100 = 10 000 kere. Kirli kontrol sistemini atlamak için başka bir çözüm var mı? AngularJS ile yeni başlayan bir kişi olarak, kontrolörler arasında kalıtımın veri depolamak için kullanılabildiğini gördüm, ancak bir "en iyi uygulama" olup olmadığını bilmiyorum. Birisi bana bu konuda ışık verebilir mi? thx – Alex

+2

@Alex Calculus'unuzdaki ikinci "100" nerededir? İfadelerinizi yalnızca bir kez değiştirmeyeceklerini biliyorsanız (bu bir kez [tembel bir kerelik ciltleme] (http://stackoverflow.com/q/23969926/2057033)) değerlendirebilirsiniz, ancak "bypass" yapamazsınız. kirli kontrol sistemi. Değerlerin onsuz değiştiğini nasıl biliyorsun? – Blackhole

+0

Evet, bunu biraz hızlı yazdım. Fonksiyonun (100 + 99 + 98 + 97 ... + 2 + 1) kez (100 element örneğimle) çağrıldığını söylemek istedim. Kirli kontrol sistemini atlayarak, bana ihanet eden kötü ingilizcem. Başka bir yaklaşım kullanarak değeri bir kez kontrol etmenin bir yolu olup olmadığını sormak istedim. Ve son olarak, tembel bir kerelik bağlayıcınız için çok teşekkürler, bu konuda bakacağım. – Alex

8

Listeniz büyük boyutta olmadığı sürece yolunuz gayet iyi. Açısal 1.3 kullanıyorsanız ve çağrı sayısını azaltmak istiyorsanız, ng-class'ınızı ng-class = ":: getBackgroundColour (singleCase)" olarak değiştirebilirsiniz. Bu, bir zaman bağlaması için geçerlidir, bu yüzden değer bir kez kararlı olduğunda, bir daha kontrol etmeyecektir. Bu, büyük olasılıkla her bir öğe için iki çağrı anlamına gelir.

+0

Teşekkür:

biri basit şeyler ancak, işlev dışında, bir sabittir colourMap ilanını taşımak için basitçe, yapmak. Dersler çok kararlı kalmalı ki bunu deneyebilirim. Fakat eğer kullanıcı veriyi değiştirir ve değiştirirse, sınıfın güncellenmesi gerekirdi ... bir kerelik bağlanma molasını bunu kullanır mıydı? – drjimmie1976

+0

allCases değişkeni için bir kerelik ciltleme kullanmadığınız sürece ng-tekrarı çalışacağından ve yeni dom öğeleri oluşturduğundan tekrar tekrar çağıracaktır. – Jason

İlgili konular