Javascript 主干木偶-基于传入数据更新视图对象
我有一个应用程序,它根据实时传入的iq数据包更新到pubsub节点 目前,当我收到请求的响应时,我正在使用主干木偶创建初始视图。这将使用模板创建一个对象,然后我需要将实时数据提供给该模板 我想使用主干木偶更新这个对象的实时数据,但我不确定如何做到这一点 当前,当我向pubsub节点接收到正确类型的iq时,我将获得我想要的信息,然后调用函数“updatewell”,该函数根据原始响应更新主干创建的对象 主干网是否能够从pubsub事件更新此对象?我怎么称呼它 下面的编辑显示了我在updatewell函数中的大致操作。骨干木偶能处理所有这些吗?它不像“用新数据替换模板”那么简单,我需要根据返回的内容隐藏/显示信息 我使用主干提线木偶的主要问题是它不断地创建新对象。在updatewell代码中,您注意到我使用唯一的ID定义div,并基于该ID(在IQ中返回给pubsub)进行更新。这意味着总是更新正确的对象,这是我在主干木偶中找不到的定义 本质上,我需要告诉木偶:“这是一组新的值,一个id为该值的模型存在吗?如果不存在,创建它,如果存在,用其他值更新它” 请询问更多信息 我的代码如下(自2014年5月1日起简化): 主干木偶码:Javascript 主干木偶-基于传入数据更新视图对象,javascript,backbone.js,marionette,publish-subscribe,updatemodel,Javascript,Backbone.js,Marionette,Publish Subscribe,Updatemodel,我有一个应用程序,它根据实时传入的iq数据包更新到pubsub节点 目前,当我收到请求的响应时,我正在使用主干木偶创建初始视图。这将使用模板创建一个对象,然后我需要将实时数据提供给该模板 我想使用主干木偶更新这个对象的实时数据,但我不确定如何做到这一点 当前,当我向pubsub节点接收到正确类型的iq时,我将获得我想要的信息,然后调用函数“updatewell”,该函数根据原始响应更新主干创建的对象 主干网是否能够从pubsub事件更新此对象?我怎么称呼它 下面的编辑显示了我在updatewel
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
}));
公共子代码:
pubsubHandlerInfo = function(iq) {
var date = $(iq).find('datetime').get()
...
MainJs.vent.trigger("updatewell", {
datetime : datetime,
title : title,
body : body,
comments : comments
});
return true;
}
编辑
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(new InfoWell)({将新模型发送到主干网。主干网将看到此模型,并检查是否已经存在ID为datetime值的模型
作为第一步,如果有具有此ID的模型,我需要使用发送的新值更新模型中的两个div(主体和注释)。如果没有具有此ID的模型,我需要创建一个正常的div(目前有效)
作为第二步,我需要检查title的值,并为title div创建一个click函数
非常感谢您提供的任何帮助
编辑:
正如Dmytro所提到的,我可以使用set和get,但我不确定这在这里是如何应用的。我应该告诉它从哪里获取现有ID,以及如何为其设置新值?任何与此相关的文档链接都将非常棒
解决方案:
因此,了解get和set以及在何处应用它是更新主干模型的主要部分
下面是我添加到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来获取其值,从上面可以看到我为每个模型分配的唯一ID值
然后,我检查这个更新值是否确实存在,如果确实存在,我调用set命令,该命令告诉它将这些新值发送到模型中,用于上述属性。请注意,我忽略了id,因为我永远不会更新模型的id
然后,正如Dmytro提到的,我在模型更改时将渲染添加到ItemView
modelEvents: {
"change": "render"
}
我的下一步,要很好地复制我的更新,就是使用“change:ATTRIBUTE”:function()
谢谢您的帮助。如果我理解正确,您需要向集合中添加项目,compositeView将自动呈现此项目()
将处理程序设置为“updatewell”事件,例如。首先
主干。模型应表示数据的当前状态,而视图应将其呈现为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'
}
});
Hi 4ega,不幸的是,这导致了与我之前相同的问题,即它不断使用更新的信息创建新对象。为了提供更多信息(将添加到原始帖子中),函数“updatewell”根据返回的信息在混合中添加了许多新函数,它不像“用新文本替换此文本”那么简单.就个人而言,我觉得主干木偶网无法处理此问题,但阅读文档后,它似乎应该能够处理此问题。您好,Dmytro,抱歉,但我不确定如何更新现有模型…您提到使用get、find或findWhere,但我不知道我正在尝试查找什么。我如何告诉它查找“此特定模型”。我是为模型使用我的自定义ID?还是主干网创建了一个?谢谢!默认情况下,主干网模型的ID是ID
属性。但是您可以使用idAttribute
将任何属性指定为ID。您可以使用get as:
var existedWell=wells.get(124)通过ID查找现有模型根据我的理解,这就是木偶的作用,你上面提到的证实了这一点(我不应该升级)