2013-01-23 43 views
5

Körükle oynamak, bazen modelin denetleyicinin content özelliğinde depolandığını buldum, bazen model doğrudan denetleyicide kullanılabilir. Ancak, durum böyle olduğunda anlamıyorum.modele modelden erişme

Bunu, sanal MVC'yi birleştirirken bulduğum bir örnekle açıklayayım.

Ayarları A - başlangıç ​​

  • I adıyla member ile MemberRoute, MemberView sınıfları ve bir şablon karşılık gelen, özel bir Member nesne tanımlandığı gibidir. kendi kendine kontrolör, formun MemberController hiçbir denetleyici böylece Sihirli Şehir Kongre tarafından, tanımlandı:
  • Member nesne vb id, nickname,
  • NOT gibi bazı özelliklerini vardı.

Ayarları B - Kurulum A olarak

  • Aynı özelleştirme, ama şimdi şablondan içinden tetiklenen bazı eylem yöntemlerini içeren tanımlanmış bir MemberController yoktur.

garip davranışlar (sırasıyla. Tamamen yok anladığım kadarıyla)

  • Kurulum A'da, ben 'ın {{id}} veya {{nickname}} doğrudan niteliklerini Member başvurabilirsiniz. Kurulum B'de
  • , ben birileri neden fark ve nerede fark anlamak için bana yardımcı olabilir, MemberView Yani

    setupController : function(controller, member) { 
        controller.set('content', member); 
    }, 
    

    yapar Sihirli Şehir belgelerinde belgelendiği gibi {{content.id}} veya {{content.nickname}}

kullanmak zorunda nedir? Şu anda, benim tahminim şablonun bağlam farklı olduğunu ya

  • olurdu (muhtemelen kumandanın kurulumunda eksik bir kod parçası var mı?)

veya

  • otomatik olarak ember tarafından sağlanan varsayılan denetleyici, özelleştirilmiş denetleyiciler için doğrudan kullanılamayan bazı ek sihirbazlara sahiptir.

Bunu anlamak için Herhangi bir yardım çok değerlidir. Şimdiye kadar gelmek için epey zamanımı aldı. İlk önce, proje kurulumunun requireJS ile getirdiği modülerizasyon olabileceğini düşündüm (iyi, bunun bir etkisi olabileceğini düşünüyorum). Ember, v1.0pre4.

Şimdiden teşekkürler! Patrick

cevap

8

Bu yüzden, birisi neden farkın ve farkın neden olduğunu anlamamda yardımcı olabilir mi? Şu anda, benim tahminim şablonun bağlam farklı ya olurdu (muhtemelen kumandanın kurulumunda eksik bir kod parçası var mı?) veya otomatik köz tarafından sağlanan varsayılan kontrolör, bazı ek sihirli sahip olduğunu özelleştirilmiş kontrolörler için doğrudan kullanılamaz.

O Kodunuzu görmeden kesin söylemek zor, ama en iyi tahmin sizin MemberControllerEmber.Controller uzanır olmasıdır. Kör tarafından sağlanan varsayılan değer (bu senaryoda), Ember.ObjectController olacaktır. Eğer istediğin buysa, sizin MemberController tanımını değiştirin: buna bir vekil, content mülkü tipik dair bir kor modelidir olarak

App.MemberController = Ember.ObjectController.extend({ 
    myProperty: 'value' 
}); 

Bir objectController davranır. Yani eğer işler doğru bir şekilde bağlanırsa, 'content' özelliği üzerinden bir modele asla erişmemelisiniz. Hiç böyle bir şey görürseniz:

{{content.id}} or {{content.nickname}} 

Eğer bir ObjectController olarak değişmelidir bir işarettir. EMBER GUIDES: REPRESENTING A SINGLE MODEL! daha detaylı bir açıklama için.

+0

, teşekkürler Michael. Bu sadece açıklama değil, kodumda neyin yanlış olduğu. App.MemberController = Ember.Controller.extend ({}); 'vardı. En azından böcek, kontrolörlerin daha iyi anlaşılmasını sağladı. tekrar thx! ph –

0

kontrolörün içeriğine ayarlanır nesneye vekil olarak bir ObjectController görür. Hiçbir denetleyici tanımlandığında, Ember sizin için bir denetleyici oluşturmak ve tanımlanmış ise rotada, model() function tarafından döndürülen ne olursa olsun nesne varsayılan olarak içeriğini belirleyecektir. Davranışınızı tanımladığınız veya Ember'in sizin için tanımlayamasa da davranış aynı olmalıdır. Şablondaki varsayılan içerik denetleyicinin kendisidir, yani this = an instance of your controller or the generated one. Eğer bu bağlamda takma ad erişmeye çalıştığınızda, Ember ilk denetleyici kendisi aleyhinde çözmeye çalışacağız ve hiçbir şey tespit edilirse önceden el kontrolörün içerik olarak ayarlayın, eğer yani nesnenin, içeriği karşı giderir.

Son olarak, dinamik URL'ler, say /foo/id that resolves against /foo/:id kullanırken haricinde Route model() function hiçbir varsayılan uygulaması yoktur, Ember böylece varsayılan bir uygulama sağlayan sağlanan kimliğe sahip bir Foo nesnesi yüklemek için sağlanan id kullanır model() işlevi. Sonunda, aynı mekanizmaya kadar, sadece sizin rahatınız için otomatik hale gelir.

İşlerin Ember tarafından sizin için otomatik şekliyle ilgili daha fazla bilgi edinmek için this dinlemenizi öneririm. Ancak görüntülenen içerik söz konusu olduğunda, kontrol cihazının içeriğini manuel olarak bağlamak için bir sihir yoktur. Mükemmel

+0

zaten işaretlenmiş olarak, Michael gerçekten noktayı yakaladı. Ama açıklamalarınız ve ilginç konuşmaların bağlantısı için teşekkürler. –

İlgili konular