0

我刚刚迁移到骨干网并且有一个奇怪的行为。
我将 draggable 附加到由脚本创建的元素,因此在 DOM 中不直接可用。
编辑:创建的元素是.nav$("#viewer")因为容器已经在 DOM 中。

在普通的 jQuery 中,我为此使用了.onmousemove事件,它起作用了。

对于骨干,我在初始化方法中使用相同的方法:

initialize: function(options) {
            this.viewer = $("#viewer");
            this.viewer.on("mousemove", '.nav', function() {
                $(this).draggable();
            });

这似乎有效,但只有一次。
拖动元素一次后,我不能再拖动它了。

与事件有冲突吗?我错过了什么吗?

4

2 回答 2

1

$('#viewer')你打电话后必须参考render()initialize之前调用过render,因此 DOM 元素不存在。

此外,使用this.$('#viewer'), 它会抓取元素(在 之后render),即使它没有被附加到页面的 DOM 中。

myView = new ExampleView({ model: myModel });
$(body).append(myView.render().el);

myView.onRender();

// -------------

// Now on your view:

onRender: function() {

  this.viewer = this.$('#viewer');
  this.viewer.on("mousemove", '.nav', function() {
    $(this).draggable();
  });

},

更新

您还可以,为了使这些事情更简单,自定义 Backbone 以onRender()在渲染后通过触发事件或其他方式自动调用该函数。

Marionette.js(一个 Backbone.js 扩展)内置了它,我一直在使用它。

于 2013-10-02T19:01:19.647 回答
1

最终解决方案非常简单:

确保不要使用过时版本的主干.js 和下划线!!

在我将版本更新到最新版本后,我使它可以使用:

render: function() {
  this.viewer.on("mouseover", '.nav', function() {
                if (!$(this).data("init")) {
                    $(this).data("init", true);
                    $(this).draggable();
                }
            });

可能仍然不是很优雅,但我无法从 dc2 中使用建议的 onRender 方法。

于 2013-10-08T16:22:09.840 回答