Backbone 路由器创建多个视图,这会导致多个事件绑定到同一个视图

holgip5t  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(116)

我是新的backbone.js和试图了解如何路线,视图等工作,现在我有一个问题,事件建立了相同的视图。这里是一个剪辑,将显示你正是我的意思. http://screencast.com/t/QIGNpeT2OUWu
这是我的 Backbone.js 路由器的样子

var Router = Backbone.Router.extend({

    routes: {
        "pages": "pages",
    }
    pages: function () {
        var page_view = new PageView();
    }
});

因此,当我单击“页面”链接时,我创建了一个新的页面视图,这就是我使用的代码

PageView = Backbone.View.extend({
    el: $("#content"),
    initialize: function () {
        $.ajax({
            url: '/pages',
            success: function (data) {
                $("#content").html(data);
            }
        });
    },
    events: {
        "click td input[type=checkbox]": "updatePublishedStatus"
    },
    updatePublishedStatus: function (event) {
        console.log('update publish status');
    }
});

我想这是非常基本的,但正如您在剪辑中所看到的,每次我导航到/页时,都会在复选框中注册另一个事件。

vmpqdwk3

vmpqdwk31#

这里有些地方出了问题。
1.你的视频显示页面是一个集合,PagesPages是一个Backbone.Model,带有诸如页面名称、slug、已发布等属性......你缺少这些,这将是有害的。你不应该只是加载一些html并将其推到你的DOM中,这违背了使用Backbone的初衷。
1.如果你为一个页面创建了一个模型,它将有一个视图。然后你的/pages路由将显示集合页面等的视图。
1.你将不会在视图的初始化中获取数据,而是通过pages.fetch();来获取数据,其中pages是Pages集合的一个示例,这甚至可以在你初始化路由器之前发生。
1.通过视图更改属性时,将更新各个模型。
顺便说一句:在initialize时获取数据不是很好。你可以在实际获取数据之前调用render(),这一点都不好玩。另外,你可以使用视图的$el来代替$('#content')。就像this.$el.html(...);中那样

kcrjzv8t

kcrjzv8t2#

var page_view = new PageView()移至Router.pages()之外。
PageView.initialize()成功回调将data保存到一个变量中。可以保存到PageView中,也可以保存到模型中。
render函数添加到设置$("#content").html(data);PageView
Router.pages()内调用page_view.render()

相关问题