2013-03-25 14 views
16

Üretime hazır olmadığı ve hala değişmediği için ember verilerini kullanmaya karar verdim. Uygulamamın yalnızca bir kaç ajax isteğinde bulunabilmesi gerekiyor. Bu yüzden bir farkın çok büyük olmaması gerekiyor. Bir ajax söz cevabını nasıl ele alacağımı anlamakta zorlanıyorum.Ember Verisi Olmadan AJAX Sözü

Kullanıcım uygulamayı yüklediğinde zaten kimliği doğrulanmış bir oturuma sahipler. Bu kullanıcı bilgisi için sunucuyu ping etmeye ve şablonumda göstermeye çalışıyorum. Benim ajax isteğim sonuçları döndürmeden önce şablonum işlenmiş gibi görünüyor ve daha sonra sözüyle güncellenmiyor. Benim şablonunda

// route 
App.ApplicationRoute = Ember.Route.extend({ 
    setupController: function(){ 
     this.set("currentUser", App.User.getCurrentUser()); 
    } 
}); 


// model 
App.User = Ember.Object.extend({ 
    email_address: '', 
    name_first: '', 
    name_last: '', 
    name_full: function() { 
     return this.get('name_first') + ' ' + this.get('name_last'); 
    }.property('name_first', 'name_last') 
}); 
App.User.reopenClass({ 
    getCurrentUser: function() { 
     return $.ajax({ 
      url: "/api/get_current_user", 
      type: "POST", 
      data: JSON.stringify({}) 
     }).then(function(response) { 
      return response; 
     }); 
    } 
}); 

:

<h1> Hey, {{App.currentUser.name_first}}</h1> 

nasıl bir yanıt alana kadar bir yanıt veya gecikme oluşturma aldığınızda ben şablonu güncellemek ki?

cevap

37

Aslında yanıt oldukça kolaydır: Bir söz kullanmanız gerekmez. Bunun yerine boş bir nesneyi iade et. Kod aşağıdaki gibi görünebilir: Burada neler oluyor

App.User.reopenClass({ 
    getCurrentUser: function() { 
     var user = App.User.create({}); //create an empty object 
     $.ajax({ 
      url: "/api/get_current_user", 
      type: "POST", 
      data: JSON.stringify({}) 
     }).then(function(response) { 
      user.setProperties(response); //fill the object with your JSON response 
     }); 
     return user; 
    } 
}); 

?

  1. boş nesnesini boş nesnesi oluşturursunuz.
  2. API ürününüze eşzamansız bir çağrı yapıyorsunuz ...
  3. ... ve Geri bildiriminiz, boş nesneyi doldurun.
  4. Kullanıcı nesnesini döndürüyorsunuz.

Not: Gerçekten neler oluyor? Yukarıda belirtilen akış, bu eylemlerin gerçekleştirildiği sıra değildir. Gerçekte, önce 1,2 ve 4 noktaları gerçekleştirilir. Daha sonra bir süre sonra, yanıt sunucunuzdan döndüğünde, 3 çalıştırılır. Yani eylemlerin gerçek akışı: 1 -> 2 -> 4 -> 3.

Yani genel kural her zaman mantık yapmak Ember sağlayan bir nesne döndürmektir. İlk olarak sizin durumunuzda ve nesneniz dolduğunda hiçbir değer gösterilmeyecek Ember, sihrini yapmaya başlayacak ve şablonlarınızı otomatik olarak güncelleyecektir. Yanınızda zor iş gerekmiyor!


ilk soru ötesine geçerek: İnsan nasıl bir dizi böyle yapsın? Bu genel kuralı takip ederek boş bir dizi döndüreceksin. Burada Arka uç tüm kullanıcıları almak ister diye, kabul biraz örnek:

App.User.reopenClass({ 
    getAllUsers: function() { 
     var users = []; //create an empty array 
     $.ajax({ 
      url: "/api/get_users", 
     }).then(function(response) { 
      response.forEach(function(user){ 
       var model = App.User.create(user); 
       users.addObject(model); //fill your array step by step 
      }); 
     }); 
     return users; 
    } 
}); 
+0

# 3 tamamlandığında öğrenebileceğim bir yol var mı? Örneğin # 3 tamamlandığında bir denetleyici yöntemini çağırmak. .observes() yardımcı görünmüyor. – Rushi

+0

Bir söz/jQuery.Deferred kullanabilirsiniz. – mavilein

+0

@mavilein, bir dizi için jQuery sözü kullanma örneğiniz var mı? Bir nesne için jQuery sözü kullanabileceğimi buldum, ancak bir dizi için bir söz kullanmaya çalıştığımda bir tür hata alıyorum. –

6

yerine önce belirtildiği gibi boş bir dizi döndürme Ember.Deferred kullanmayı tercih ediyorum.Modeliniz kanca yapmanız gereken Toplamda

App.User.reopenClass({ 
    getAllUsers: function() { 
    var dfd = Ember.Deferred.create(); 
    var users = []; 

    $.ajax({ 
     url: "/api/get_users", 
    }).then(function(response) { 
     response.forEach(function(user){ 
      var model = App.User.create(user); 
      users.addObject(model); 
     }); 
     dfd.resolve(users); 
    }); 
    return dfd; 
    } 
}); 

bu

model: function(){ 
    return App.User.getAllUsers(); 
} 

Kor enought akıllı olduğunu ve modelin doğru şekilde ayarlanır giderilmiş oluyor kez seni iade sözünü ele bilir Ayrıca bir jQuery sözünü iade edebilir, ancak size bazı garip davranışlar verecektir.

+0

Sadece hızlı bir test yaptınız ve Ember Deferred kullanmak, Ember'in yükleme trafiğinden de yararlanmanızı sağlar. Sadece bir Ember dizisi yükleme alt sınıfı kullanıyorsanız, işe yaramıyor görünüyorsun (http://jsfiddle.net/UJ4Su/10/) – Sarus

+3

Sadece bir not Ember.Deferred [şu anda RSVP.promise lehine önerilmemektedir] (http://emberjs.com/guides/deprecations/#toc_deprecate-ember-deferredmixin-and-ember-deferred). –

0

Siz de böylece sevdiği ApplicationRoute için model olarak geçerli kullanıcı ayarlayabilirsiniz: vaadi yerine getirir veya reddeder ya kadar

App.ApplicationRoute = Ember.Route.extend({ 
    model: function() { 
     return App.User.getCurrentUser(); 
    } 
}); 

getCurrentUser() yana döner bir söz geçiş askıya alırız.

Bu, zaman geçişi bittiğinde modeliniz başlatıldığı ve şablonda işlendiğini göreceğiniz için kullanışlıdır.

Ember kılavuzlarına read up more about async routing yapabilirsiniz.

İlgili konular