У меня есть приложение, которое обновляется на основе входящих входящих пакетов 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": функция().
Спасибо за помощь.
Привет, Dmytro, Извините, но я не уверен, как получить существующую модель для обновления ... вы упоминаете использование get, find или findWhere, но я не знаю, что я пытаюсь найти. Как мне сказать, чтобы найти «эту конкретную модель». Использую ли я свой собственный идентификатор для модели? Или позвольте создать его? Благодаря! – Gary
По умолчанию идентификатор модели базовой линии является атрибутом 'id'. Но вы можете указать любой атрибут как id, используя 'idAttribute' http://backbonejs.org/#Model-idAttribute. И вы можете найти существующую модель по id, используя 'get as:' var existedWell = wells.get (124); ' –
Hi Dmytro, извините, что последний ответ был перенесен в другой проект, но, наконец, вернулся сюда. Просматривая это чуть больше недели, и я не могу узнать, как сказать марионетку: «Это куча новых значений, проверьте, существует ли модель с этим идентификатором (ID - это дата-время), и если он обновляет значения, если нет, создайте его "**. По моему мнению, это то, что делает марионетка и что вы упомянули выше, подтверждает (я не должен сразу обновлять HTML). Я обновил свой код, чтобы значительно упростить то, что мне действительно нужно делать. Еще раз спасибо. – Gary