2012-06-06 10 views
9
Ext.define('DigitalPaper.controller.Documents', { 
extend: 'Ext.app.Controller', 

views: ['Documents'], 
stores: ['Documents'], 
models: ['Documents'], 

init: function() { 
    console.log('[OK] Init Controller: Documents'); 
} 
}); 

Jaka jest funkcja uzyskania modelu lub widoku tego kontrolera? PróbowałemExtjs4 MVC, jak uzyskać model lub widok z klasy kontrolera?

Ext.getModel('Documents'); 
    this.getModel('Documents'); 
    this.getModel(); 
    this.getDocumentsModel(); 

Wszelkie sugeruje?

Odpowiedz

9

Rozwiązanie Znaleziono:

W regulatorze możliwe jest użycie odniesienie do widoku:

refs: [{ 
    ref: 'viewDocuments', // will be create the method this.getViewDocuments(); 
    selector: 'Documents' 
}], 

Więc można uzyskać widok z tego:

this.getViewDocuments(); 
+6

Nikt nigdy nie wydaje się mówić, gdzie "this.getViewDocuments();" musi być - lub "to" jest w kontekście, w którym ludzie oczekują, że go użyję :( –

+0

@PaulHutchinson Korzystając z sekcji "refs" w definicji kontrolera ExtJS, można utworzyć szybkie odwołania do często używanych komponentów. utwórz "getter" metody na podstawie dostarczonego tekstu dla "ref" .W tym przykładzie, utworzony getter jest "getViewDocuments." To może być wywołane w kontrolerze, gdzie "to" odnosi się do zakresu kontrolera. jest używane w wynikowym wywołaniu Ext.ComponentQuery.query(). Zobacz dokumentację dla ComponentQuery.query() i zobacz, jak potężna może być definicja selektora! –

0

Funkcja getModel() i getView() nie zwracają modelu/widoków kontrolera - zwracają ich wystąpienia w aplikacji (a jeśli żadne nie istnieją, zostaną uruchomione).

można po prostu użyć tego, aby uzyskać nazwy widok/Model:

this.views[0] 

nie jestem pewien, gdzie używasz dostaje (tzn this.getModel („Szczegóły”)), ale te powinien poprawnie zwrócić instancję modelu (konstruktor jest jedynym miejscem, w którym możesz mieć problemy odnoszące się do tych).

+0

Ta odpowiedź nie nie ma sensu. –

+0

Tak, musiałem źle zrozumieć to pytanie.I masz rację, getModel zwraca klasę, a nie instancję; dlatego używamy .create(); – Izhaki

1

ta powinna działać:

Ext.define('DigitalPaper.controller.Documents', { 
extend: 'Ext.app.Controller', 

views: ['Documents'], 
stores: ['Documents'], 
models: ['Documents'], 

init: function() { 
    console.log('[OK] Init Controller: Documents'); 

    // get references to view and model classes which can be used to create new instances 
    console.log('View', this.getDocumentsView()); 
    console.log('Model', this.getDocumentsModel()); 

    // reference the Documents store 
    console.log('Store', this.getDocumentsStore()); 

} 

});

Metody te są tworzone za pomocą metody kontrolera Ext, która tworzy moduły pobierające. http://docs.sencha.com/ext-js/4-0/source/Controller.html#Ext-app-Controller

Oto, co to metoda wygląda następująco:

createGetters: function(type, refs) { 
    type = Ext.String.capitalize(type); 
    Ext.Array.each(refs, function(ref) { 
     var fn = 'get', 
      parts = ref.split('.'); 

     // Handle namespaced class names. E.g. feed.Add becomes getFeedAddView etc. 
     Ext.Array.each(parts, function(part) { 
      fn += Ext.String.capitalize(part); 
     }); 
     fn += type; 

     if (!this[fn]) { 
      this[fn] = Ext.Function.pass(this['get' + type], [ref], this); 
     } 
     // Execute it right away 
     this[fn](ref); 
    }, 
    this); 
}, 
+0

Funkcja getDocumentsView() nie zwraca instancji widoku dokumentów. –

+0

Dobrze. Zaktualizowałem przykładowy fragment komentarza, który zwraca uwagę na to, co zwracają moduły pobierające. –

+0

Zobacz function() Funkcja modelu() Store Object {events = {...}, data = {...}, groupers = {...}, altri elementi ...} -> Otrzymuję to w konsoli, działa dla sklepu, ale nie dla widoku i modelu. Otrzymuję "function()" –

7

kontrolery Ext są dość dziwne, że istnieje tylko jedno wystąpienie danego kontrolera, bez względu na to jak wiele związanych przypadki zobacz może masz. W większości systemów MVC lub MVP istnieje jedna instancja kontrolera na instancję widoku.

Jeśli planujesz używać wielu instancji widoku, nie powinieneś przechowywać odniesień do tych widoków w kontrolerze.

Możecie zajrzeć do rozszerzenia MVC zręczne za ExtJS który ma wystąpienie jednego kontrolera per view instancji (plus wstrzykiwania zależności):

http://deftjs.org/

Anyways, controller.getView() zwraca odwołanie do wyświetl CLASS, a nie instancję obiektu. To samo z getModel(). getStore() DOES zwraca instancję sklepu.

W kontrolerze można zrobić coś takiego:

this.viewInstance = this.getDocumentsView().create(); 

Chciałbym również polecić nazywając swój model w liczbie pojedynczej. To nie jest Dokumenty. To jest Dokument.

Powiązane problemy