2012-09-08 18 views
15

AngularJS kapsamında: Her olay işleyicide $ giriş() çağrılır (giriş yönergesi için anahtar/giriş olayları, select yönergesi için değişiklik olayı, vb) ve diğer bazı durumlarda.

Bkz. small example. Diğer kapsamda değişikliklerin ortaya çıkmasına rağmen ngRepeat'ın her bir anahtarda yeniden hesaplandığını ve yeniden çizildiğini görünüyor. Bu kararın mantığını bilmek ilginç olurdu.

cevap

17

Bu konuda AngularJS yazarlarına sahip olmak harika olurdu ama $ digest() öğesinin $ rootScope üzerinde çağrılması gerektiğine inanıyorum, çünkü tekrarlayıcıda tetiklenen değişiklikler diğer kapsamlarda ($ rootScope bile) yan etkilere sahip olabilir. .

Sorun, çocuk kapsamlarında tetiklenen yöntemlerinin, üst kapsamdaki nesnelere (üst düzey alt öğelerden devraldığı için) etkilerini etkilemesidir. Bu nedenle, alt kapsamlardan tanımlanan işlevler, bir üst kapsamdaki başvurusu nesnesini değiştiremiyor olsa bile, üst kapsamda tanımlanmış nesnelerdeki değerleri değiştirebilirler.

yukarıda en öğelerin bir listesini içeren bir (biraz yapay) örneği ele alalım, böylece şifreli biraz gelebilir: Şimdi

$scope.items = [{name: 'foo', value:0}, {name: 'bar', value:0}, {name: 'baz', value:0}]; 

yukarıdaki listesini görüntülemek için kullanılması ng-tekrarlayın edelim ve en diyelim Bir öğeye tıklamak diğer öğesinin değerini artırmalıdır (bir kez daha, örnek biraz suni ancak burada, bir kapsamda tetiklenen bir eylemin diğer kapsamlarda yan etkisi olabilir). Böyle gidebiliriz:

$scope.incOther = function(item) { 
     for (var i=0; i<$scope.items.length; i++){ 
      if ($scope.items[i] !== item){ 
       $scope.items[i].value++; 
      } 
     } 
    }; 

örnek işlevi diğer kapsamlarda ve angularjs değerleri değişiklik yapacağı - Doğru sonuçlarını görüntülemek için - $ rootScope kadar ana kapsamları içinde gözlemcilerini (değerlendirmek ihtiyacını biz nerede bilmiyorum çünkü bir nesne tanımlandı). İşte

bu gösteren eksiksiz jsFiddle geçerli: http://jsfiddle.net/pkozlowski_opensource/Z6e5g/3/ jsFiddle yukarıda da gözlemcileri değerlendirme gerçekten çok üstünde başlamak gerektiğini göstermek için bir $ rootScope bir nesneyi kapsamaktadır Aslında

.

+0

Teşekkürler. Kesinlikle haklısın. $ Parent.obj, $ parent. $ Parent.obj, vb. Kullanarak tüm nesneyi bile değiştirebildiğim için, nesnenin değerlerini ana kapsamlarda değiştirebileceğimi unuttum. –

İlgili konular