2013-11-27 5 views
5

Kullanıcıları bir listeye ekleyebileceğim ve kaldırabileceğim basit bir uygulama var. Bir öğeyi kaldırırken açısal kapsam güncellenmiyor

şekilde

yeni bir kullanıcı $scope.newPerson bağlanan ekleyin. Formu gönderirken, person nesnelerini içeren bir dizi olan $scope.people'a newPerson nesnesini ekliyorum.

ng-repeat yönergesi ile people dizisinin üzerine, kapsamı şu anda eklenmiş olan kişileri yazdırmak için kullanıyorum. Ben Kaldır düğmesini tıkladığımızda, bu işlevi gerçekleştirmek

div.row(data-person, ng-repeat="person in people", ng-model="person") 
    button(ng-click="removePerson(person)") Remove 

: Bu satırlar bütün (Yeşim pasajı) bir kaldırma düğmesi bulunur Bu tablodan satırı kaldırır

$scope.removePerson = function(person) { 
    var index = $scope.people.indexOf(person); 
    if (index > -1) { 
    $scope.people.splice(index, 1); 
    person = null; 
    } 
} 

ve person setleri kapsamı null. Batarang, daha sonra { This scope has no models } gösterir.

Ancak, benim people dizi güncelleme olmadığını fark etmiş. Batarang’daki kapsamı kontrol ettiğimde, yeni sildiğim kişi hala o dizide. Yeni bir kişi eklemek için yazmaya başladığımda, güncellenir. Tüm sayfayı sunucumdan bunu yapmadan gönderirseniz, dizi hala kaldırılmış kişileri içerir.

i person = null; sonra $scope.$apply() koyarsanız

, ben ancak bir apply is in progress bir hata atar, beklenen davranışı olsun. Ayrıca, $apply() numaralı telefonu arayarak okumanın kötü bir uygulama olduğunu düşünüyorum. (?)

Ben Açısal yeniyim ve bu sorunu çözme konusunda birçok bilgi bulmak için görünmüyor olabilir. Bir kişiyi kaldırdığımda dizimi güncellemeyi nasıl yapabilirim? Teşekkürler.

+0

mümkün mü? Bir kapsam sorunu olduğuna inanıyorum, ancak tüm kapsamları/yönergeleri/denetleyicilerinin nasıl kurulduğunu görmek için sağladığınız bilgiler yeterli değil. – dtabuenc

+0

BTW, kişi = null, işlev içinde null değerine kişiyi ayarlama dışında bir şey yapmıyor (bu işlevin dışındaki kişiyi değiştirmez). Ayrıca, siz haklısınız, kendinizi asla aramamalısınız (harici bir etkinliğe yanıt olarak bir direktif dışında). – dtabuenc

cevap

4

döndürmez: ng-repeat blokta ng-model

Artık: Refactored

div.row(data-person, ng-repeat="person in people") 

ng-clickremovePerson() için olay:

<button ng-click="removePerson($index)"> 
    Remove 
</button> 

ve buna removePerson() kodu değişti:

$scope.removePerson = function(index) { 
    $scope.people.splice(index, 1); 
}; 

Bu aynı zamanda bir Batarang sorunu olduğunu fark çünkü bu aslında sabit şey, benim daha önceki kod ile karşılaştırıldığında emin değilim. HTML'ye {{ people }} veya console.log($scope.people) günlüğüne girdiğimde, people dizi güncellemesini görüyorum. Ancak, Batarang'da dizi güncellenmez.

Ders: bazen kendinizi araçları güvenerek daha iyidir şeyler çıkış yapmayı;) Sorununuzu demostrates hızlı jsfiddle veya plnkr yaratmak için

-3

dilim yöntemi dizinizi güncellemek, ama bunu düzeltmek için aşağıdaki yaptım Yeni bir

+3

'slice'! =' Splice'! – Yoshi

+0

Buraya 'ekleme' ye ihtiyacım var, kesinlikle 'dilim' değil? – cabaret

+0

Evet, ekleme doğrudur ve diziyi değiştirir. – dtabuenc