1

У меня есть приложение, которое обновляется на основе входящих входящих пакетов iq на узел pubsub.Магистральная магистраль - обновление объекта просмотра на основе входящих данных

В настоящее время я использую базовую марионетку, чтобы создать представление, когда я получаю ответ со своей просьбы. Это создает объект с использованием шаблона, который мне тогда необходимо для подачи данных в реальном времени.

Я хочу использовать магистральную марионетку, чтобы обновить этот объект с помощью живых данных, но я не уверен, как это будет сделано.

В настоящее время, когда я получаю правильный тип iq для узла pubsub, я получаю информацию, которую хочу, а затем вызываю функцию «updatewell», которая обновляет объект, созданный основой из исходного ответа.

Является ли позвоночник способным обновить этот объект от события pubsub? Как я могу это назвать?

В приведенном ниже примере показано, что я делаю в функции updatewell. Может ли эта марионетка справиться с этим? Это не так просто, как «заменить шаблон новыми данными», мне нужно скрыть/показать информацию на основе возвращаемого.

Основная проблема, с которой я использую магистральную марионетку, заключается в том, что она постоянно создает новые объекты. В коде updatewell вы замечаете, что я определяю divs с уникальным идентификатором и обновлением на основе этого идентификатора (который возвращается в IQ в pubsub). Это означает, что правильный объект всегда обновляется, что-то, что я не могу найти, в определении марионетки.

В сущности, мне нужно сказать марионетке: «Это новый набор значений, имеет ли модель с этим значением, поскольку она существует? Если нет, создайте ее, если это произойдет, обновите ее другими значениями "

Пришлите, пожалуйста, дополнительную информацию.

Мой код ниже (упрощенно по состоянию на 1 мая 2014):

Backbone марионеток код:

InfoWell = Backbone.Model.extend({}); 

InfoWells = Backbone.Collection.extend({ 
    model : InfoWell 
}); 

InfoWellView = Backbone.Marionette.ItemView.extend({ 
    template : "#template-infowell", 
    tagName : 'div', 
    className : 'alert alert-custom', 

initialize: function() { 
    this.$el.prop("id", this.model.get("datetime")); 
}, 
}); 

InfoWellsView = Backbone.Marionette.CompositeView.extend({ 
    tagName : "div", 
    id : "info-well-list", 
    template : "#template-infowells", 
    itemView : InfoWellView, 

}); 

MainJs.addInitializer(function(options) { 
    var aInfoWellsView = new InfoWellsView({ 
     collection : options.InfoWells 
    }); 
    MainJs.InfoWellsContainer.show(aInfoWellsView); 
}); 

var InfoWells = new InfoWells(); 

Код ответа для создания хорошо:

InfoWells.add(new InfoWell({ 
     id : datetime, 
     datetime : datetime, 
     title : title, 
     body : body, 
     comments : comments 
    })); 

PubSub код:

pubsubHandlerInfo = function(iq) { 
    var date = $(iq).find('datetime').get() 
    ...  
    MainJs.vent.trigger("updatewell", { 
     datetime : datetime, 
     title : title, 
     body : body, 
     comments : comments 
    }); 
    return true; 
} 

EDIT Updatewell функция:

MainJs.vent.bind("updatewell", function(data) { 
     var datetime = data.datetime; 

     if (datetime.length) { 
      $("#hidden-state").trigger('testactions'); 
      $('#hidden-state').bind('testactions', updateWell(data)) 
     } 

     function updateWell(data) { 

     $("#body-" + data.datetime).html(data.body); 
     $("#comments-" + data.datetime).html(data.comments); 

     if (data.title === "something1") { 
      $("#"+data.datetime+"-Something1").unbind('click').click(something1Action) 
     } else if (data.title === "something2") { 
      $("#"+data.datetime+"-Something2").unbind('click').click(something2Action) 
     } 

     function something1Action() {MainJs.function1();} 
     function something2Action() {MainJs.function2();} 
    }); 

Таким образом, в словах, что я пытаюсь сделать это: Заменить MainJs.vent.trigger ("updatewell", { с InfoWells.add (новый InfoWell ({, чтобы отправить новую модель на магистраль. Магистраль увидит эту модель и проверит, существует ли уже модель с идентификатором значения datetime.

В качестве первого шага, если есть модель с этим ID, Мне нужно обновить два div в модели (тело и комментарий) с новыми значениями, отправленными. Если нет модели с этим идентификатором, мне нужно создать ее как обычно (которая работает в данный момент).

В качестве второго шага мне нужно будет проверить значение заголовка и создать функцию щелчка для заголовка.

Большое спасибо за любую помощь, которую вы можете предоставить.

EDIT: Как уже упоминалось, Dmytro, я могу использовать set и get, но я не уверен, как это применимо здесь. Где я могу сказать, чтобы получить существующий идентификатор и как мне установить для него новые значения? Любая ссылка на документацию по этому поводу была бы блестящей, пожалуйста.

РЕШЕНИЕ: Итак, понять, как получить и установить, и где применять его, является основной частью обновления базовых моделей.

Ниже приведен код, который я добавил в свой обработчик pubsub, который делает это правильно.

var update = InfoWells.get(datetime); 
    console.log(update); 
    if (update !== undefined && update !== null){ 
     update.set({ 
title : title, 
body : body, 
comments : comments 
     }); 
    }; 

Для тех, кто хочет знать, что я делаю. Я создаю переменную под названием update, которая получает значение от просмотра коллекции (InfoWells) и получения идентификатора со значением datetime, который сверху показывает уникальное значение идентификатора, присваиваемое каждой моделью.

я затем проверить, если это значение обновления на самом деле существует, и если это не я называю установить команды, которая говорит ему, чтобы отправить эти новые значения в модель атрибутов, упомянутых. Обратите внимание, что я оставил id, поскольку я никогда не буду обновлять это для модели.

Затем, как отметил Дмитро, я добавил рендер в ItemView при изменении модели.

modelEvents: { 
     "change": "render" 
    } 

Следующий шаг для меня, чтобы повторить мое обновление хорошо, использовать "изменение: Attribute": функция().

Спасибо за помощь.

ответ

1

Прежде всего Backbone.Model должен представлять текущее состояние ваших данных, а представление должно отображать его в HTML. Обновление HTML напрямую - это не марионетка.

Если вы хотите, чтобы не создавать новую модель, но обновление вышел, когда получать данные о существовавшем, который вы можете просто найти существовавшую модель в коллекции (с использованием, get или find или findWhere) и обновлять его с новыми атрибутами, используя set.

В вашей модели будут активированы события change, если некоторые атрибуты изменились. Вы можете слушать это событие и засавить ваш взгляд, используя modelEvents:

InfoWellView = Backbone.Marionette.ItemView.extend({ 
    template : "#template-infowell", 
    tagName : 'div', 
    className : 'alert alert-custom', 
    modelEvents: { 
     'change': 'render' 
    } 
}); 
+0

Привет, Dmytro, Извините, но я не уверен, как получить существующую модель для обновления ... вы упоминаете использование get, find или findWhere, но я не знаю, что я пытаюсь найти. Как мне сказать, чтобы найти «эту конкретную модель». Использую ли я свой собственный идентификатор для модели? Или позвольте создать его? Благодаря! – Gary

+0

По умолчанию идентификатор модели базовой линии является атрибутом 'id'. Но вы можете указать любой атрибут как id, используя 'idAttribute' http://backbonejs.org/#Model-idAttribute. И вы можете найти существующую модель по id, используя 'get as:' var existedWell = wells.get (124); ' –

+0

Hi Dmytro, извините, что последний ответ был перенесен в другой проект, но, наконец, вернулся сюда. Просматривая это чуть больше недели, и я не могу узнать, как сказать марионетку: «Это куча новых значений, проверьте, существует ли модель с этим идентификатором (ID - это дата-время), и если он обновляет значения, если нет, создайте его "**. По моему мнению, это то, что делает марионетка и что вы упомянули выше, подтверждает (я не должен сразу обновлять HTML). Я обновил свой код, чтобы значительно упростить то, что мне действительно нужно делать. Еще раз спасибо. – Gary

0

Если я правильно понял, вам нужно добавить элемент в коллекцию, составное изображение автоматически отобразит этот элемент (wiki).

Установить обработчик на событие «updatewell», например here.

+0

Привет 4ega, К сожалению, это приводит к тому же вопросу, который я имел, прежде, где он постоянно создает новые объекты с обновленной информацией.Чтобы дать дополнительную информацию (добавьте к исходному сообщению), функция updatewell добавляет в набор несколько новых функций на основе возвращаемой информации, это не так просто, как «Заменить этот текст новым текстом». Лично я не чувствую, что марионетка может справиться с этим, но, читая документацию, похоже, она должна быть в состоянии. – Gary