2013-07-21 7 views
5

Mam aplikację KO i każda z moich stron ma osobny model widoku, który obsługuje wszystkie czynności wymagane na tej stronie (ładowanie, dodawanie, edytowanie, usuwanie itd.). Udało mi się podzielić kod na wiele modułów przy użyciu RequireJS, ale nie mogę znaleźć sposobu, aby wiele modeli widoku działało jednocześnie za pomocą Sammy.Knockout, Require, Sammy i model widoku dla każdej strony - jak mogę to zrobić?

To jest konfiguracja, którą mam w pliku init.js, która ładuje zawartość na pierwszej stronie. Działa:

require(['jquery', 'ko', 'sammy', 'viewmodels/page1'], function($, ko, sammy, page1) { 
    var page1VM = new page1.ViewModel(); 
    ko.applyBindings(page1VM); 

    var app = sammy('#wrapper', function() { 
    this.get('#page1', function() { 
     page1VM.loadContent(); 
    }); 

    this.get('#page2', function() { 
     // do nothing yet 
    }); 

    [...] 

    this.get('#pageX', function() { 
     // do nothing yet 
    }); 
    }); 

    app.run('#page1'); 
}); 

Jak powiązać inne modele widoku z innymi stronami?

Próbowałem także dodać oddzielną ko.applyBindings dla każdej strony w środku this.get, która spowodowała błąd po przełączeniu z powrotem na stronę, która już zastosowała te wiązania.

+3

Być może zainteresuje Cię Durandal, który jest ramą, która w zasadzie łączy wszystkie te rzeczy razem dla ciebie. – Tyrsius

Odpowiedz

2

http://jsfiddle.net/PgLgz/4/

Alright Wróciłem na skrzypce i wyczyścić cały kod w górę, aby pokazać, co mam na myśli skutecznie przez moją odpowiedź -

function myViewModel() { 
    var self = this; 
    self.message = "hey"; 
    self.page1VM = new page1VM(); 
    self.page2VM = new page2VM(); 
    var app = sammy('#wrapper', function() { 
     this.get('#page1', function() { 
      page1VM .loadContent(); 
     }); 
    }); 
}; 

ko.applyBindings(new myViewModel()); 

Pamiętaj jednak, że na skrzypcach ja naprawdę nie mogę wykorzystuję Sammy.js (nie zmieniam widoków ani nawigacji) i zasadniczo nie ma powodu, aby używać Require.js, ponieważ jest to tylko przykład, a wszystkie modele widoku umieszczam w tym samym pliku JS.

Ponieważ używasz Sammy i Require, będziesz musiał albo wziąć ten kod i funkcjonalnie zastosować go do swojej witryny, albo gdzieś umieścić większy fragment kodu.

+0

Wygląda na to, że nie działa bez aplikacji applyBindings. Może robię coś nie tak. Oto model widoku page1: http://snippi.com/s/jwcf5zb – Norbert

+0

Tak, nadal musisz zastosować powiązania. Zaktualizuję odpowiedź, aby uwzględnić tę informację: –

+0

To jest rzucanie błędu "obiekt nie jest funkcją" dla linii applyBindings. – Norbert

Powiązane problemy