#javascript #backbone.js
#javascript #backbone.js
Вопрос:
Пытаясь изучить Backbone и натыкаясь на камень преткновения при попытке извлечения данных, я отлично извлекаю данные из своего представления SearchBarView
, но как только данные были извлечены, я не знаю, как я могу получить эти данные в моем SearchResultsView, чтобы оформить каждый результат в шаблон?
Извините, если это звучит немного расплывчато, в данный момент я пытаюсь разобраться в этом, поэтому мог бы воспользоваться руководством!
SearchBarView
performSearch: function(searchTerm) {
// So trim any whitespace to make sure the word being used in the search is totally correct
var search = $.trim(searchTerm);
// Quick check if the search is empty then do nothing
if(search.length <= 0) {
return false;
}
// Make the fetch using our search term
dataStore.videos.getVideos(searchTerm);
},
Переходит к VideoSearchCollection
getVideos: function(searchTerm) {
console.log('Videos:getVideos', searchTerm);
// Update the search term property which will then be updated when the url method is run
// Note make sure any url changes are made BEFORE calling fetch
this.searchTerm = searchTerm;
this.fetch();
},
SearchResultsView
initialize: function() {
// listens to a change in the collection by the sync event and calls the render method
this.listenTo(this.collection, 'sync', this.render);
console.log('This collection should look like this: ', this.collection);
},
render: function() {
var self = this,
gridFragment = this.createItems();
this.$el.html(gridFragment);
return this;
},
createItems: function() {
var self = this,
gridFragment = document.createDocumentFragment();
this.collection.each(function (video) {
var searchResultView = new SearchResultView({
'model': video
});
gridFragment.appendChild(searchResultView.el);
}, this);
return gridFragment;
}
Теперь я не уверен, как я могу получить эти данные внутри SearchResultView
, я думаю, мне нужно откуда-то запустить событие и прослушать событие в initialize
функции, но я не уверен, где я создаю этот триггер и выполняется ли триггер автоматически.
Комментарии:
1. показать код, связанный с
SearchResultView
2. @coding_idiot Я добавил свой код для SearchResultView, надеюсь, это поможет
Ответ №1:
Решение 1
Если dataStore
это глобальная переменная, то SearchBarView
dataStore - appears like a global variable
videos - a collection attached to global variable
затем в
SearchResultsView
this.listenTo(dataStore.videos, 'sync', this.render);
Решение 2
If dataStore
не является глобальной переменной
getVideos: function(searchTerm) {
console.log('Videos:getVideos', searchTerm);
// Update the search term property which will then be updated when the url method is run
// Note make sure any url changes are made BEFORE calling fetch
this.searchTerm = searchTerm;
var coll=this; //this should refer to the collection itself
this.fetch().done(function(){
var searchResultView = new SearchResultsView({collection:coll});
searchResultView.render();
});
},
Комментарии:
1. вот и все, я действительно запутался и пытался запускать события и т.д. Вместо прослушивания события синхронизации коллекций. Спасибо!
Ответ №2:
Не на 100% ясно, как вы инициализируете свой SearchResultView.
Но, чтобы иметь ссылку на коллекцию, разве вы не можете просто передать ссылку на конструктор представления. Что-то вроде этого:
// В вашем SearchbarView
var myCollection = new Backbone.Collection(); // and you are populating the collection somewhere somehow
var searchResultView = new SearchResultView(myCollection) // you just pass this collection as argument.
myCollection.bind("change", function(){
searchResultView.parentCollection = myCollection;
}
И внутри вашего searchResultView вы просто ссылаетесь на эту коллекцию, например, с помощью parentCollection.
Если вы сделаете это более явным в отношении того, как эти 2 представления связаны, я, возможно, смогу вам больше помочь. Но с учетом предоставленной информации это кажется самым простым способом.
Комментарии:
1. привет, спасибо за ответ, да, в принципе, на данный момент я не уверен, как и где инициализировать мой SearchResultView, например, я делаю это внутри SearchBarView сразу после выполнения выборки, или выборка выдаст событие, которое я могу прослушать и передать данные. В идеале я хочу затем сделать // Затем мы хотим создать наше представление SearchResults, используя коллекцию, установленную в хранилище данных для фильмов this.SearchResults = new SearchResultsView({ ‘collection’: dataStore.videos });
2. Вы можете инициализировать свое представление после выборки, а затем обновлять свою коллекцию в searchResultView всякий раз, когда коллекция изменяется. Это может быть сделано с помощью этого кода — MyCollection.bind(«изменить», функция(){ searchResultView.collection = MyCollection; }