2013-03-14 3 views
1

Когда я пытаюсь добавить мой позвоночник в два разных места одновременно, в моем методе успеха работают только два приложения добавления. Ты знаешь почему?Приобретите магистраль EL дважды в Ajax Успех не работает

$(content).prepend(this.$el.append(this.template({ data: data }))); 

$(chat_window).prepend(this.$el.append(this.template({ data: data }))); 
+0

какой метод успеха вы имеете в виду? – explunit

ответ

3

Каждый узел DOM может иметь ровно 0 или 1 родительских узлов, не более чем 1. Если добавить узел куда-нибудь, он получает удаляется из его текущего родителя, а затем добавляется к новому родителю. Здесь вам понадобятся 2 разных экземпляра представления, каждый из которых имеет свой собственный элемент.

+0

Это кажется неэффективным. –

+0

Я не думаю, что вы думаете об этом с места знания. Неэффективен против чего? С точки зрения какого ресурса? Обычно большинство страниц в базовом приложении состоят из множества десятков мнений. Вы не можете избежать необходимости в 2 элементах из-за того, что DOM является древовидной структурой. –

1

el соответствует одному элементу html, образующему основу view. В этот элемент html вы можете добавить больше html-погоды, это будет еще одна основа view или рендеринг template.

Следовательно, в вашем случае, если el прилагается дважды, он, наконец, остается там, где он был прикреплен последним к дереву. Если вы хотите прикрепить в нескольких местах, то я предполагаю, что вам нужно создать экземпляр базовой линии view дважды.

0

На мой взгляд, мнение, о котором вы говорите, не должно знать о его далеких родителях или двоюродных братьях, а должно инициировать событие «У меня есть новый контент», а затем заинтересованные взгляды могут действовать так, как они хотят.

Если у вас есть разница между представлением и его html-представлением, вы можете создать свое приложение так, чтобы вы получили 2 места в html, где вы помещаете «.new-content-holder» и передаете это селектор как эль вашего взгляда при создании. Затем 2 места будут обновляться одновременно без специального программирования. Иногда я использую этот метод, например, когда хочу, чтобы в списке и в списке отображался длинный список.

Некоторые HTML:

<div class="content"> 
    <p>Recent comments</> 
    <ul class="new-content-holder"></ul> 
</div> 

<div class="chat-room"> 
    Live feed 
    <ul class="new-content-holder"> 
    <li>a chat message</li> 
    <li>another chat message</li> 
    </ul> 
</div> 

И вид

.... 
var MessageView = Backbone.View.extend({ 
    template: _.template('<li class="chat-message"><%= message %></li>'), 

    prependData: function(data){ 
    this.$el.prepend(this.template(data)) 
    }, 

    onMessage: function(message) { 
    this.prependData({message: message.data}) 
    } 

}); 
.... 

//And in a super controller of sorts : 
var messageView = new MessageView(el: '.new-message-holder') 

Опять же, это не очень хорошее разделение проблем ... но я надеюсь, что помогает.

0

Я согласен с @Peter Lyons, вы не можете ввести один и тот же узел в два элемента. В конечном итоге узел переместится на новый элемент. Один из способов - получить HTML из элемента, который вы хотите ввести, и дважды ввести тот же HTML. Поскольку html является строкой, а не элементом dom. Вы можете добавить его столько раз, сколько внутри.

Попробуйте это:

var html = this.$el.append(this.template({ data: data })).html(); 
$(content).prepend(html); 
$(chat_window).prepend(html); 

Я надеюсь, что вы не используете идентификаторы на элементы внутри шаблона.

PS: Я точно не знаю ваш прецедент.

Смежные вопросы