使用 Backbone.js 创建后对 HTML 元素进行动画处理



下面给出了我的这段代码。在这种情况下,如何使用类似 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
});

对象视图:

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

对象容器视图:

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哈希,或者更准确地说,我省略了selector,因为

省略选择器会导致事件绑定到视图的根元素 (this.el )。

似乎这正是您想要的。其次,我删除了ObjectView的模板。当然,您可以使用它,但在这种情况下,我认为没有必要。第三,为了保持一致性,我重命名了变量。随意询问。

最新更新