gpt4 book ai didi

jquery - 使用backbone.js显示/隐藏div/view

转载 作者:行者123 更新时间:2023-12-01 02:43:53 24 4
gpt4 key购买 nike

我开始使用backbone.js 并遇到了一个问题。我希望能够通过 onclick 事件显示/隐藏 div (由 View 呈现)。问题是事件仅适用于子元素,并且被单击的元素是 View 的同级/父元素。我已经通过在 View “初始化”函数中添加处理程序来解决这个问题,但我不认为这是要走的路。我也没有使用“主视图”,否则我怎样才能完成这项工作?

最佳答案

如果没有父 View ,那么您可以像这样在每个 View 之外的 View 之间连接事件。

var viewClicked = new ViewClicked();

var viewListening = new ViewListening();

viewListening.listenTo(viewClicked, "clicked:view", viewListening.respondToClick);

您不需要父 View 来执行上述操作,即使父 View 可能是一个好主意(如评论所示)。事实上,无论您是否在父 View 中连接事件,方法都是相同的!

因此,您可以按照自己的方式通过在初始化函数中处理事件来完成此操作,但这会将一个 View 耦合到另一个 View 。或者,您可以像上面演示的那样进行操作,这可以防止 View 耦合,但需要父 View 、某种闭包或污染全局范围。一般来说,最好不要紧密耦合 View ,因为它会减少封装和可能的重用,因此您可以考虑以某种方式进行更改以采用上述方法。

最后,您可以使用某种中央事件总线(pub sub 对象),这在 this question 中进行了讨论。 。这将引入另一个对象,但允许您在 View 的初始化函数中处理事件,但耦合不太紧密(您将耦合到全局或作用域事件总线,而不是特定 View )。

当然,您也可以在父 View 中使用本地范围的事件总线:)

更新

如果您只有一个 View 并且 anchor 位于 View 之外,则可以在 anchor 上使用标准 jQuery 单击事件来调用 View 上的切换函数。需要注意的是,使用 _.bindAll 来确保切换事件的上下文是 View 对象。例如:

HTML

<a href="#" id="showView">click me</a> 

<div id="myView"></div>

JavaScript

var MyView = Backbone.View.extend({
initialize: function() {
// _.bindAll binds functions called by events to the
// view (by passing it the view context as 'this'
_.bindAll(this, "toggle");

// put some content in the view
this.$el.append("Now you see me!");
},

toggle: function() {
// jQuery toggle function
this.$el.toggle();
}
});

var myView = new MyView({ el: $("#myView")});

$("#showView").click(myView.toggle);

我为您提供了 working fiddle这样您就可以看到它的实际效果。

我提到的关于使用父 View 或某种闭包的最初观点仍然是一个好主意。真的有什么理由不这样做吗?

更新2

使用包含 subview 的父 View 执行此操作,如下所示:

HTML

<div id="parentView"></div>

JavaScript

var ShowView = Backbone.View.extend({
events: {
"click #showView": "click"
},

click: function() {
this.trigger("showView:click");
},

render: function() {
this.$el.append('<a href="#" id="showView">click me</a>');
return this;
}
});

var MyView = Backbone.View.extend({
initialize: function() {
// _.bindAll binds functions called by events to the
// view (by passing it the view context as 'this'
_.bindAll(this, "toggle");

// put some content in the view
},

render: function() {
this.$el.append('Now you see me!');
return this;
},

toggle: function() {
// jQuery toggle function
this.$el.toggle();
}
});

var ParentView = Backbone.View.extend({
initialize: function() {
this.showView = new ShowView({
id: "showView"
});
this.myView = new MyView({
id: "myView"
});
this.listenTo(this.showView, "showView:click", this.myView.toggle)
},

render: function() {
this.$el.append(this.showView.render().$el);
this.$el.append(this.myView.render().$el);
return this;
}

});

var parentView = new ParentView ({el: $("#parentView") });
parentView.render();

这是一个working fiddle展示它。您可能认为采用家长观点的方法对于您的问题的上下文来说是多余的,您可能是对的!然而,随着您的应用程序变得更加复杂,许多 View 嵌套在多个级别上,您会发现父 View 方法开始变得更有意义并发挥作用。

关于jquery - 使用backbone.js显示/隐藏div/view,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17461286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com