2013-05-14 13 views
18

Jestem bardzo zdezorientowany przy użyciu metody pobierania modelu backbone.js. Patrz poniższy przykład
szkieletową routera:jak działa metoda pobierania modelu backbone.js

profile: function(id) { 
    var model = new Account({id:id}); 
    console.log("<---------profile router-------->"); 
    this.changeView(new ProfileView({model:model})); 
    model.fetch(); 
} 

pierwszy krok, konto model zostanie instancja, model konto wygląda tak.

define(['models/StatusCollection'], function(StatusCollection) { 
    var Account = Backbone.Model.extend({ 
    urlRoot: '/accounts', 

    initialize: function() { 
     this.status  = new StatusCollection(); 
     this.status.url = '/accounts/' + this.id + '/status'; 
     this.activity  = new StatusCollection(); 
     this.activity.url = '/accounts/' + this.id + '/activity'; 
    } 
    }); 

    return Account; 
}); 

urlObiekt własności dla tego, co to jest? Po utworzeniu obiektu modelu, widok profilu będzie renderowany za pomocą tego this.changeView (new ProfileView ({model: model}));, funkcja changeview wygląda następująco.

changeView: function(view) { 
    if (null != this.currentView) { 
    this.currentView.undelegateEvents(); 
    } 
    this.currentView = view; 
    this.currentView.render(); 
}, 

po renderowanie widoku, informacje o profilu będzie jeszcze wyświetlany, ale po model.fetch(); wykonanie instrukcji, dane z modelu będą wyświetlane, dlaczego? Naprawdę nie wiem, jak działa, próbuję się dowiedzieć, ale nie mam szans.

Odpowiedz

38

Nie jestem do końca pewien, jakie jest twoje pytanie, ale dołożę wszelkich starań, by wyjaśnić, co mogę.

Koncepcja adresu urlRoot jest podstawowym adresem URL, a elementy potomne zostaną pobrane poniżej identyfikatora dodanego do tego urlRoot.

Na przykład, następujący kod:

var Account = Backbone.Model.extend({ 
    urlRoot: '/accounts' 
}); 

ustawi adres bazowy. Następnie, jeśli były do ​​wystąpienia tego i wywołać fetch():

var anAccount = new Account({id: 'abcd1234'}); 
anAccount.fetch(); 

byłoby wprowadzić następujące zapytanie:

GET /accounts/abcd1234 

tam sprawy, jesteś ustawienie UrlRoot a następnie jawnie ustawienie url więc podany adres urlRoot zostanie zignorowany.

zachęcam zajrzeć do źródła Backbone (to zaskakująco zwięzłe), aby zobaczyć, jak url pochodzi: http://backbonejs.org/docs/backbone.html#section-65

Aby odpowiedzieć na inne pytanie, powodem Twoje dane profilowe nie będą natychmiast wyświetlane jest fetch () wychodzi do sieci, przechodzi na serwer i musi czekać na odpowiedź, zanim będzie można ją wyświetlić.

To nie jest natychmiastowe.

Odbywa się to w sposób nieblokujący, co oznacza, że ​​spowoduje żądanie, będzie kontynuował robienie tego, co robi, a kiedy żądanie wróci z serwera, uruchamia zdarzenie, którego używa Backbone, aby upewnić się, że cokolwiek innego to musiało zostać zrobione, teraz, kiedy masz dane modelu, jest zrobione.

Wrzuciłem kilka uwag w swoim fragmencie, aby wyjaśnić, co się dzieje tutaj:

profile: function(id) { 
    // You are instantiating a model, giving it the id passed to it as an argument 
    var model = new Account({id:id}); 
    console.log("<---------profile router-------->"); 

    // You are instantiating a new view with a fresh model, but its data has 
    // not yet been fetched so the view will not display properly 
    this.changeView(new ProfileView({model:model})); 

    // You are fetching the data here. It will be a little while while the request goes 
    // from your browser, over the network, hits the server, gets the response. After 
    // getting the response, this will fire a 'sync' event which your view can use to 
    // re-render now that your model has its data. 
    model.fetch(); 
} 

Więc jeśli chcesz mieć pewność, twój pogląd jest aktualizowana po modelem została pobrana istnieje kilka sposobów, dzięki którym can zrób to: (1) przekaż skuteczne wywołanie zwrotne do modelu.fetch() (2) zarejestrowanie programu obsługi w swoim zegarze widoku dla zdarzenia "synchronizacji", ponowne wyświetlenie widoku po jego zwróceniu (3) umieszczenie kodu uruchamiającego widok w powodzeniu zwrotnym, w ten sposób widok nie będzie być tworzone aż do momentu, gdy żądanie sieciowe powróci i twój model ma swoje dane.

+0

pierwsze dzięki za odpowiedź, jest to bardzo miły opis. mam więcej pytań, po fetch() uruchomił zdarzenie "synchronizacji", widok będzie renderować automatycznie? sugestie, które mi dajesz, możesz zrobić kilka przykładów, ponieważ jestem całkiem nowy w backbonejs i javascript, znam ten język dobrze, ale niezbyt dobrze. –

+0

adres URL zostanie zastąpiony prawą? W związku z tym var base = _.result (this, 'urlRoot') || _.result (this.collection, 'url') || urlError() ;? –

+0

W przypadku pierwszego pytania, żadne zdarzenie synchronizacji nie spowoduje automatycznego renderowania widoku. Jeśli chcesz włączyć to, dodaj: "view.on (" sync ", this.render, this);" –