5

$scope.raw içinde fooditems listesi var ve bu verileri sütunlarda göstermek istiyorum, böylece yapıyı biraz değiştiriyorum. Bunu sortStuff() işlevinde yapıyorum ve güncel verileri $scope.allfood'da saklıyorum.

$scope.$watch('raw', function(){ 
    $scope.allfood = $scope.sortStuff(); 
    console.log($scope.allfood); 
}, true); 

Bu yemek etrafında sürüklenen ne olacağını ise: $scope.raw yılında sortStuff() her zaman şey değişiklikleri çağıran bir $ izle (gıda kategorisini değiştirmek için sürükle ve bırak kullanıyorum) Orada

receive:function(event, ui) { 
    var issueScope = angular.element(ui.item).scope(); 
    scope.$apply(function() { 
     var recp = _.find(scope.raw, function(lineitem){ 
      return lineitem.name === issueScope.receipe.name; 
     }) 
     recp.cat = scope.col.name; 
    }) 

    $(ui.item).remove(); // remove DOM 
} 

Temel olarak, $scope.raw'un içinde doğru nesneyi arayın ve cat ürününü yiyecek için yeni bir kategori olarak değiştirin. Ayrıca dom öğesini siliyorum, çünkü görünümü yenilemek için ng-yinelemeye güveniyorum. Bu iyi çalışıyor gibi görünüyor: $ watch içinde const.log, nesnenin doğru kategoriye taşındığını ve verilerin neye benzemesi gerektiğini gösteriyor. Ancak, görsel olarak ng tekrarı verileri yansıtmaz.

Here's the jsfiddle.

Bir öğeyi B'den C'ye sürüklemek iyi çalışıyor. Biri A'dan B'ye sürüklemek, B'den iki maddeyi ortadan kaldırır ... sonuçlar çok tutarsızdır ve ne olduğu hakkında hiçbir fikrim yok.

Herhangi bir fikir yanlış giden nedir? Ya da bunu yapmak için daha iyi bir yol için herhangi bir öneri?

+0

Sen $ watchCollection kullanarak olmalıdır ('ham' function() {}); ama ben yaptım ve hala benim app aynı sorunları görüyorum ... – philwills

cevap

5

Kodunuzdaki sorun, ng-repeat yönergesinin listedeki her öğeye $$hashKey özelliğini eklemesidir. Bu özellik, DOM öğelerini dizi öğeleriyle ilişkilendirmek için yönergeyle kullanılır.

Öğeleri referans olarak geçirdiğinizden, ng-repeat yönergesi, $$hashKey özelliğine doğrudan $scope.raw dizinizin nesnelerine yazılır. Basit bir çözüm, nesneleri $scope.allfood nesnesine yerleştirmeden önce kopyalamaktır. $scope.raw ait nesneler bakir kalırken

_.each($scope.raw, function(recp){ 
    recp = _.clone(recp); 
    switch(recp.cat){ 
     ... 
    } 
}); 

Şimdi ng-repeat, $scope.allfood nesneleri günceller.

güncellenmiş keman bakınız:

http://jsfiddle.net/b8Fa7/5/

+0

Teşekkürler, bu işe yarıyor! Yine de iki soru: bir nesneyi açısal olarak eklenen "$$ hashKey" gibi özellikler olmadan klonlamak mümkün mü? Ayrıca, bunu yapmanın daha iyi bir yolu olduğunu mu düşünüyorsun? Açısal değişimin, tüm $ width.allfood'un tüm değişikliklerinde yeniden üretilmesi, performans için iyi olamaz ve bir şekilde bundan kaçınmak isterim. – networkprofile

+1

'angular.copy',' $$ hashKey' gibi özellikleri olmayan bir dizinin veya nesnenin derin bir kopyasını oluşturmanın bir yolunu sağlar: http://docs.angularjs.org/api/angular.copy – frececroka

+1

Muhtemelen takip edebilirsiniz "$ scope.raw" dizisindeki tüm değişikliklerin listesi ve yalnızca izlenen değişikliklere dayanarak "$ scope.allfood" nesnesini değiştirir. Bunun, liste küçük olsa da, kayda değer bir performans artışı getirdiğini sanmıyorum. – frececroka