теряемся между возможностями, предоставляемыми обрабатывать этот случай: допустим, мы имеем следующие ограничения:Нокаут SPA Ajax нагруженных шаблонов
- Нокаут
- SPA с Sammy.js - Html, загруженным с помощью Ajax
Моя страница:
+-------------------------------+
| #navigation |
+---------+---------------------+
| #sidebar| #content |
| | |
| | |
| | |
+---------+---------------------+
в настоящее время у меня есть один appViewModel, который обрабатывать д ata-bind для всех общих элементов моего сайта: #navigation и #sidebar. Этот appViewModel имеет наблюдаемое значение, используемое на всех страницах моего сайта.
appViewModel = function() {
var self = this;
self.sidebarItemArray = ko.observableArray([x, y, z]);
self.currentRoute = ko.observable();
...
self.updateView = function(path, currentRoute) {
return $.get(path, function(data) {
var $data = $(data);
// Updates #content, TITLE and update the currentRoute observable.
$('#content').replaceWith($data.find('#content'));
document.title = $data.filter('title').text();
self.currentRoute(currentRoute);
}, 'html');
}
Sammy(function() {
this.get(':link'', function() {
self.updateView(this.path, this.params.link);
});
}).run();
}
ko.applyBindings(new appViewModel());
Теперь предположим, что #content - это часть DOM, загружаемая через Ajax Call. Каждый раз, когда пользователь нажимает ссылку внутри #navigation или #sidebar, Sammy.js перехватывает его, а затем обновляет #content. Проблема в том, что в новом DOM внутри #content есть привязки данных.
1) Во-первых, я должен использовать HTML данных привязку на #content, ReplaceWith (как указано выше) или шаблон связывания с пользовательской функции, чтобы получить шаблон? (http://knockoutjs.com/documentation/template-binding.html#note-5-dynamically-choosing-which-template-is-used)? Что такое лучшая практика здесь?
2) Должен ли Сэмми жить в appViewModel, как в документации, так и в другом месте, просто отлично?
3) Как только метод updateView будет завершен, как бы вы связали новый DOM? Как внизу? Разве нет риска перезаписи какого-либо DOM, потому что ko.applyBindings уже вызывается без второго аргумента?
ko.applyBindings(new routeSpecificViewModel() , document.getElementById("content"));
Я благодарен вам за помощь.
Поскольку это больше года, я хотел бы спросить, если вы когда-либо придумать решение? Я столкнулся с такой же точной дилеммой. – mls3590712
Старый вопрос :-) Я закончил тем, что использовал нокаут AMD с requireJs и flatiron/Director в качестве маршрутизатора. Это работает как шарм. Использование этого стека создаст ограничения, которые помогут избежать этих вопросов. – Xavier13