jquery - 使用 Backbone.js 创建 HTML 元素后设置动画

标签 jquery backbone.js

下面给出了我的代码。在这种情况下,如何使用类似 JQuery 的动画来调整元素的大小?详细信息以注释形式写在代码中。

模板:

<script id="content_template" type="text/template">
        <div
                class="content"
                style="position: absolute;
                    top:<%= top %>px;
                    left:<%= left %>px;
                    width:<%= width %>px;
                    height:<%= height %>px; "
        ></div>
</script>

型号:

var FrameObject = Backbone.Model.extend({
    defaults: {
        top: 0,
        left: 0,
        width: 1,
        height: 1
    }
});

集合:

var FrameObjects = Backbone.Collection.extend({
    model: FrameObject
});

对象 View :

var Object_view = Backbone.View.extend({
    template: _.template($("#content_template").html()),
    render:function(){
        return this.template(this.model.toJSON());
    }
});

对象容器 View :

var App_view = Backbone.View.extend({
    el: $(".container"),
    events: {
        "click .container": "create_object"
    },
    create_object: function(event){
        var frame_object = new FrameObject({
            top: event.pageX,
            left: event.pageY,
            width: 100,
            height: 100
        });
        frame_objects.add(frame_object);

        var object_view = new Object_view({model: frame_object});
        this.$(".container").append(object_view.render());

        /* here I want to change the 'top' & 'left' attributes of the object model
           and want my object_view to animate to that position. Same as it would do for -

           someElement.animate({top: newTop, left: newLeft});
        */
    }
});

最佳答案

我写了一个简单的例子:

var FrameObject = Backbone.Model.extend({
    defaults: {
        top: 0,
        left: 0,
        width: 1,
        height: 1
    }
});

var FrameObjects = Backbone.Collection.extend({
    model: FrameObject
});

var ObjectView = Backbone.View.extend({
    className: 'frame',

    initialize: function() {
        this.model.on('change', this.animate, this);
    },

    render: function() {
        var params = _.extend(this.model.toJSON(),  { position: 'absolute' });
        this.$el.css(params);
        return this;
    },

    animate: function() {
        this.$el.animate(this.model.toJSON());
    }
});

var AppView = Backbone.View.extend({
    el: $("#container"),

    events: {
        "click": "createObject"
    },

    createObject: function(event) {
        var frameObject = new FrameObject({
            top: event.pageY,
            left: event.pageX,
            width: 100,
            height: 100
        });

        var frameObjects = new FrameObjects();

        frameObjects.add(frameObject);

        var objectView = new ObjectView({
            model: frameObject
        });
        this.$el.append(objectView.render().el);

        setTimeout(function() {
            frameObject.set({
                // 500 — width of #container
                top: Math.random() * 500,
                left: Math.random() * 500
            })
        }, 1000);
    }
});

var appView = new AppView();

http://jsfiddle.net/theotheo/4Y8gy/

请注意,我对您的代码进行了一些更改。首先,我更改了 AppView 的 events 哈希,或者更准确地说,我省略了 selectorbecause

Omitting the selector causes the event to be bound to the view's root element (this.el).

看来这正是你想要的。其次,我删除了ObjectView的模板。当然,你可以使用它,但在这种情况下我认为没有必要。第三,我将变量重命名为 for the sake of consistency 。 欢迎询问。

关于jquery - 使用 Backbone.js 创建 HTML 元素后设置动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11137416/

相关文章:

javascript - 由于过滤器值中存在 `@` 符号,脚本中出现电子邮件验证错误

javascript - Backbone.Wreqr 与 Javascript 对象

javascript - Jquery 动画最初在 Safari 中失败

jquery - 悬停时暂停 css 动画,然后从点继续

javascript - 未捕获的类型错误 : undefined is not a function rails3/backbone/js

javascript - 将 JSON 数组放入 Handlebars

javascript - 将模型添加到集合中

javascript - 使单页 Web 应用程序可被社交网络 (Facebook/Twitter/reddit) 抓取

javascript - JQuery 是否适用于具有相同 ID 的所有按钮(不同页面)

javascript - 如何使用此 JSON 数据(如数组)