Javascript 主干木偶-基于传入数据更新视图对象

Javascript 主干木偶-基于传入数据更新视图对象,javascript,backbone.js,marionette,publish-subscribe,updatemodel,Javascript,Backbone.js,Marionette,Publish Subscribe,Updatemodel,我有一个应用程序,它根据实时传入的iq数据包更新到pubsub节点 目前,当我收到请求的响应时,我正在使用主干木偶创建初始视图。这将使用模板创建一个对象,然后我需要将实时数据提供给该模板 我想使用主干木偶更新这个对象的实时数据,但我不确定如何做到这一点 当前,当我向pubsub节点接收到正确类型的iq时,我将获得我想要的信息,然后调用函数“updatewell”,该函数根据原始响应更新主干创建的对象 主干网是否能够从pubsub事件更新此对象?我怎么称呼它 下面的编辑显示了我在updatewel

我有一个应用程序,它根据实时传入的iq数据包更新到pubsub节点

目前,当我收到请求的响应时,我正在使用主干木偶创建初始视图。这将使用模板创建一个对象,然后我需要将实时数据提供给该模板

我想使用主干木偶更新这个对象的实时数据,但我不确定如何做到这一点

当前,当我向pubsub节点接收到正确类型的iq时,我将获得我想要的信息,然后调用函数“updatewell”,该函数根据原始响应更新主干创建的对象

主干网是否能够从pubsub事件更新此对象?我怎么称呼它

下面的编辑显示了我在updatewell函数中的大致操作。骨干木偶能处理所有这些吗?它不像“用新数据替换模板”那么简单,我需要根据返回的内容隐藏/显示信息

我使用主干提线木偶的主要问题是它不断地创建新对象。在updatewell代码中,您注意到我使用唯一的ID定义div,并基于该ID(在IQ中返回给pubsub)进行更新。这意味着总是更新正确的对象,这是我在主干木偶中找不到的定义

本质上,我需要告诉木偶:“这是一组新的值,一个id为该值的模型存在吗?如果不存在,创建它,如果存在,用其他值更新它”

请询问更多信息

我的代码如下(自2014年5月1日起简化):

主干木偶码:

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查找现有模型根据我的理解,这就是木偶的作用,你上面提到的证实了这一点(我不应该升级)