Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 如何让一个视图意识到另一个视图';什么变化?_Backbone.js - Fatal编程技术网

Backbone.js 如何让一个视图意识到另一个视图';什么变化?

Backbone.js 如何让一个视图意识到另一个视图';什么变化?,backbone.js,Backbone.js,假设您正在制作一个音乐库应用程序 您有一个带有流派列表的视图和另一个显示所选流派内容的视图。当用户单击列表上的某个流派时,其他视图中的内容应相应更新 要做到这一点,使依赖关系最小化,最好的方法是什么 我找不到任何其他地方可以听到鼠标点击的声音,除了绘制单个流派的视图。我可以从那里发送一个事件,但是让该事件更新绘制流派内容的其他视图的最佳方式是什么?谁应该收听该活动、流派内容视图或其收藏 编辑:我从应用程序的路由器实例化了这两个视图,并通过使视图相互了解来实现这一点,但这当然不是最佳的。您可以制作

假设您正在制作一个音乐库应用程序

您有一个带有流派列表的视图和另一个显示所选流派内容的视图。当用户单击列表上的某个流派时,其他视图中的内容应相应更新

要做到这一点,使依赖关系最小化,最好的方法是什么

我找不到任何其他地方可以听到鼠标点击的声音,除了绘制单个流派的视图。我可以从那里发送一个事件,但是让该事件更新绘制流派内容的其他视图的最佳方式是什么?谁应该收听该活动、流派内容视图或其收藏


编辑:我从应用程序的路由器实例化了这两个视图,并通过使视图相互了解来实现这一点,但这当然不是最佳的。

您可以制作一个简单的模型来保存应用程序状态,您不需要任何花哨的东西,只需要一包实现常用主干事件方法的数据:

var AppState  = Backbone.Model.extend({});
var app_state = new AppState();
然后,流派列表视图将侦听单击事件(正如您已经听到的),并在有人更改应用程序状态模型时设置当前流派:

var Genres = Backbone.View.extend({
    //...
    choose: function(ev) {
        // This would be the click handler for the genre,
        // `.html()` is just for demonstration purposes, you'd
        // probably use a data attribute in real life.
        app_state.set({genre: $(ev.target).html() });
    },
});
单个类型的视图将侦听应用程序状态模型上的
“更改:类型”
事件,并在类型更改时作出反应:

var Genre = Backbone.View.extend({
    initialize: function() {
        _.bindAll(this, 'change_genre');
        app_state.on('change:genre', this.change_genre);
    },
    //...
    change_genre: function() {
        // Refill the genre display...
    }
});
演示:

您可以为任何需要的数据创建模型,而模型是在主干网中处理数据事件的一种方便方法。作为一个额外的好处,这种方法使得持久化应用程序的状态变得相当容易:只需将通常的主干持久化支持添加到
AppState
,就可以了


如果您只需要一个简单的事件总线来推送非数据事件,您可以使用主干网的方法来构建一个简单的事件聚合器:

app.events = _.extend({}, Backbone.Events);
然后,假设您有一个全局
app
名称空间,您可以这样说:

app.events.on('some-event', some_function);


我所看到的最好的方法是由提出的方法。简而言之,您可以创建一个事件聚合器,它提供一个集中式对象,用于引发不同视图可以订阅的事件。此解决方案的优点在于,它的实现非常简单,因为它利用了主干网现有的事件系统。

谢谢,这是一个很好的答案!我使用RequireJS作为依赖项,但我想我只是在路由器中创建了AppState模型,在那里我创建了视图,并将其作为依赖项添加到视图中——持久性是一个了不起的副作用@wannabeartist:您还可以根据需要向AppState添加其他应用程序级数据(当前跟踪、搜索过滤器等),所有内容都会井然有序。
app.events.trigger('some-event', arg1, arg2, ...);