当前位置: 首页 > 知识库问答 >
问题:

引用一个集合的多个主干视图

贺季同
2023-03-14

我试图创建我的第一个主干应用程序,并有一些困难让我的头脑如何使用视图。

我试图做的是有一个搜索输入,每次提交它从服务器获取一个集合。我想有一个视图控制搜索输入区域,并收听那里发生的事件(在我的例子中是一个按钮点击),另一个视图带有显示搜索结果的子视图。

单个结果将有其他方法(如查找他们输入的日期或时间等)。

我的模型和集合定义如下:

SearchResult = Backbone.model.extend({
    defaults: {
        title: null,
        text: null
    }
});

SearchResults = Backbone.Collection.extend({
    model: SearchResult,
    initialize: function(query){
        this.query = query;
        this.fetch();
    },
    url: function() {
        return '/search/' + this.query()
    }
});

在我的视图中,有一个视图表示搜索输入:

var SearchView = Backbone.View.extend({
    el: $('#search'),
    events: {
        'click button': 'doSearch' 
    },
    doSearch: function() {
        console.log('starting new search');
        var resultSet = new SearchResults($('input[type=text]', this.el).val());
        var resultSetView = new ResultView(resultSet); 
    }
});

var searchView = new SearchView();

var ResultSetView = Backbone.View.extend({
    el: $('#search'),
    initialize: function(resultSet) {
        this.collection = resultSet;
        this.render();
    },
    render: function() {
        _(this.collection.models).each(function(result) {
            var resultView = new ResultView({model:result});
        }, this);
    }
});

var ResultView = Backbone.view.extend({
     tagName: 'div',
     model: SearchResult,
     initialize: function() {
         this.render();
     },
     render: function(){ 
         $(this.el).append(this.model.get(title) + '<br>' + this.model.get('text'));
     }
});

我的html大致如下所示:

<body>
<div id="search">
    <input type="text">
    <button>submit</button>
</div>
<div id="results">

</div>

</body>

在我的代码中,它一直延伸到控制台。日志(“开始新搜索”)但是没有从ResultSetView集合的initialize方法对服务器进行ajax调用。

我设计得对吗,或者有更好的方法来做这件事。我认为因为两个视图绑定到不同的dom元素,我不应该从另一个视图中实例化一个视图。任何建议都很感激,如果我需要更清楚地说明这一点,请让我知道,我会尽力重新措辞这个问题。

共有3个答案

陆阳曜
2023-03-14

在你的示例代码修复所有错别字后,我有一个工作的jsFiddle。

您可以看到,单击按钮后,AJAX调用完成。当然,回答是错误的,但这不是重点。

所以我的结论是,您的问题在代码的另一部分。

东门理
2023-03-14

您没有告诉您的ResultSetView侦听集合中的任何事件。“fetch”是异步的。成功完成后,将发送“重置”事件。视图需要侦听该事件,然后对该事件执行它需要执行的任何操作(如渲染)。

方楷
2023-03-14

一些问题(可能不是唯一的问题):

  • 您的SearchView没有绑定到集合重置事件;正如所写的那样,它将尝试立即渲染,而集合仍然是空的。
  • 当SearchView应该实例化合成视图ResultSetView时,它会实例化单个视图ResultView。
  • 您正在将一个参数传递给Search结果集合的构造函数,但这不是使用它的正确方法。看到这一点上的留档。
 类似资料:
  • 我用脊梁骨。js 我试图从服务器获取我的数据,但它不起作用 (服务器发送json对象) 我搜索了但没有回应 我的代码哪里不正确?

  • 下面是我用(FacetModels)填充我的收藏的内容 如何访问可用值[]数组 “FacetModels”:[{“FacetDisplayLabel”:null,“SelectedValues”:[],“AvailableValues”:[],“UnknownResults”:0,“ActionURI”:null,“FacetGroupName”:“Category”,“FacetGroupFri

  • 问题内容: 我正在开发一个将用作其他应用程序的可扩展框架的应用程序。 基本类之一称为节点,节点具有内容。SQL表如下所示: TABLE节点(NodeId int,....等) 表格NodeContentRelationship(NodeId int,ContentType字符串,ContentId int) 开发人员可以扩展应用程序以创建自己的内容类型。 显然,从关系数据库的角度来看,这很不好,因

  • 我有一个收藏模型的典型结构。 在视图中,每个对象都有一个“编辑”按钮,该按钮应该取消激活其他对象的所有“编辑”按钮。 我想知道这样做的最佳做法是什么。谢谢!!

  • 我正在向我的主干集合中添加一个项目,如下所示: 我在MyCollection中覆盖了同步,如下所示: 但是,似乎在add之后不会调用sync,add成功执行并触发“add”事件。我错过什么了吗?还是这是正确的行为?

  • 我有一个骨干应用程序,我正在构建与Trigger.io,并有一点困惑,为什么当我单击手机工具栏中的后退按钮时,数据正在消失。 以下是设置: 我有一个视图SearchResultsView,看起来像这样(为了简洁起见删除了Trigger.io代码): 以下是模板: 这是路由器: 它在实践中是这样工作的:当我最初加载页面时,没有结果列表(应该是这样)。我输入查询并执行搜索,然后它会回来,按照它应该的方