2013-03-15 14 views
31

Bir öğenin tüm içeriğini observableArray yeni içeriğiyle değiştirmeye çalışıyorum.Göze çarpabilirken öğeyi değiştirmeArray

var oldLocation = ko.utils.arrayFirst(self.locations(), function (item) { 
    return item.id == value.id; 
}); 
self.locations.replace(self.locations.indexOf(oldLocation), new location(value)); 
self.locations.valueHasMutated(); 

Ben de

self.locations[self.locations.indexOf(location)] = new fizi.ko.models.location(value); 

denedim Ama hiçbir şey çalışıyor. Endeks düzgün bir şekilde alınmakta ancak öğenin güncellenmesi gerçekleşmiyor.

+0

"Ama hiçbir şey çalışmıyor" ile ne demek istiyorsun? Dizideki yeni öğeye sahip değil misiniz? Yoksa UI'daki yerini göremiyor musunuz? Lütfen html ve bağlaçlarınızı ve ayrıca bir konum nesnesinin nasıl göründüğünü gönderin! Her ikisi de – nemesv

+0

. Model güncellenmediğinden ve model güncellenmediğinden, kullanıcı modeli güncellenmemektedir. – bflemi3

cevap

45

Değiştirme işlevi, değiştirmek istediğiniz öğeyi ve değiştirmek istediğiniz yeni öğeyi iki parametreyi kabul eder. Değiştirilecek öğenin yerine dizini geçiriyorsunuz, dolayısıyla çalışmaz.

yerine çağrı olmalıdır:

Yan not
self.locations.replace(oldLocation, new location(value)); 

, bunu replace() çağrısıyla çağrılan alacak, orada valueHasMutated() çağrıyı gerekmez.

+9

Sormam gerek, nerede Yeryüzü, gözlemlenebilir bir dizide değiştirme yönteminden bahseden belgelerdir? Baktım ve baktım ve belgelerin herhangi bir yerinde göremedim! –

+4

@PaulManzotti - Madde 7/http://www.knockmeout.net/2011/06/10-things-to-know-about-knockoutjs-on.html, eklenen yöntemlerden bahseder. – DaveB

+1

Teşekkürler, bu sayfayı işaretli tutmaya devam edeceğim! :) –

1

Diziler için JavaScript'te veya Knockout'ta bir değiştirme yönteminin farkında değilim. Bir şey mi eksik? Eğer ikinci yöntemi kullanmak istiyorsanız

, o zaman gözlemlenebilir olarak yerlere erişmek gerekir:

self.locations()[self.locations.indexOf(location)] = new fizi.ko.models.location(value); 
self.locations.valueHasMutated(); 

Eğer indexOf kullanarak olmadığında da, gözlemlenebilir diziler için bunun bir Nakavt sürümü var olduğu .

+1

Hiçbir yerde belgelendiğini görmedim, ancak kaynak kodda: https://github.com/knockout/knockout/blob/master/src/subscribables/observableArray.js –

4

ben sadece bunu yapmak için alternatif bir yol değinmek istiyorum:

self.locations.splice(
    self.locations.indexOf(location), // Index of the 1st element to remove 
    1,         // Number of elements to remote at this index 
    new fizi.ko.models.location(value) // A param for each element to add at the index 
); 

Nakavt belgelerinde splice içerir, ancak replace içermez: Knockout Obervable Arrays Docs. Ancak, kaynak koduna bakarsanız, her iki işlevin de uygulandığını göreceksiniz (en azından KO 3.0'de, önceki sürümlerde replace'un eksik olup olmadığını bilmiyorum).

İlgili konular