gpt4 book ai didi

javascript - backbone.js:同一进程的不同输出

转载 作者:行者123 更新时间:2023-11-29 22:06:55 25 4
gpt4 key购买 nike

处理 Addy Osmani's backbone.js tutorialsetElement 部分.

他举了这个例子:

// We create two DOM elements representing buttons
// which could easily be containers or something else
var button1 = $('<button></button>');
var button2 = $('<button></button>');

// Define a new view
var View = Backbone.View.extend({
events: {
click: function(e) {
console.log(view.el === e.target);
}
}
});

// Create a new instance of the view, applying it
// to button1
var view = new View({el: button1});

// Apply the view to button2 using setElement
view.setElement(button2);

button1.trigger('click');
button2.trigger('click');

但是,他没有解释为什么 button1.trigger('click');button2.trigger('click'); 的输出不同-- 可能是个愚蠢的问题,我知道这些是将 View 附加到按钮元素的不同方式,但为什么 button2.trigger('click'); 也返回 true

最佳答案

button1.trigger('click'); 不应从该代码产生任何输出。

setElement相当简单:

setElement view.setElement(element)

If you'd like to apply a Backbone view to a different DOM element, use setElement, which will also create the cached $el reference and move the view's delegated events from the old element to the new one.

所以 view.setElement(e) 做了四件事:

  1. view.el 中取消绑定(bind) View 的 events
  2. 设置 view.el = e
  3. 设置 view.$el = Backbone.$(e)
  4. 将 View 的事件绑定(bind)到新的view.el

结果是没有任何内容会监听来自 button1 的事件,view 将监听来自 button2 的事件。

一个更详尽的示例可能会有所帮助,所以让我们附加一些更多的点击事件处理程序:

var button1 = $('<button id="button1"></button>').click(function() {
console.log('button1 jQuery', this);
});
var button2 = $('<button id="button2"></button>').click(function() {
console.log('button2 jQuery', this);
});

var View = Backbone.View.extend({
events: {
click: function(e) {
console.log('Backbone ', view.el, view.el === e.target);
}
}
});

var view = new View({el: button1});
view.setElement(button2);

button1.trigger('click');
button2.trigger('click');

演示:http://jsfiddle.net/ambiguous/S7A9z/

那应该会在控制台中给你这样的东西:

button1 jQuery <button id=​"button1">​</button>​
button2 jQuery <button id=​"button2">​</button>​
Backbone <button id=​"button2">​</button>​ true

两个原始 jQuery 事件处理程序都将按预期触发,但我们只会通过 Backbone 获取 button2 事件,因为 setElement 调用发生在 trigger 调用。

那么为什么 view.el === e.target 是真的?嗯,你点击了 button2 所以 e.target 将是 button2view.setElement(button2) 调用替换了 view.el,因此 Backbone click 处理程序中的 this.el 也将是 button2

关于javascript - backbone.js:同一进程的不同输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20434863/

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