Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery ui 链接jQuery可排序列表和主干集合_Jquery Ui_Backbone.js_Jquery Ui Sortable - Fatal编程技术网

Jquery ui 链接jQuery可排序列表和主干集合

Jquery ui 链接jQuery可排序列表和主干集合,jquery-ui,backbone.js,jquery-ui-sortable,Jquery Ui,Backbone.js,Jquery Ui Sortable,我仍然在用主干网找到自己的路,过去我总是使用Prototype而不是jQuery,所以如果我做了一些愚蠢的事情,请原谅我 我正在尝试开发一个包含多个连接的无序列表的UI,其中每个可排序的列表都由一个单独的主干集合表示。我正在使用ICanHaz和胡须模板,但这对我的问题并不重要 在列表之间拖动项目时,如何最好地实现集合的自动更新(从一个集合中删除模型并将其插入到另一个集合中)?我目前正试图在jQueryUI可排序交互中使用receive和remove方法——至少我说的对吗 var WS = {};

我仍然在用主干网找到自己的路,过去我总是使用Prototype而不是jQuery,所以如果我做了一些愚蠢的事情,请原谅我

我正在尝试开发一个包含多个连接的无序列表的UI,其中每个可排序的列表都由一个单独的主干集合表示。我正在使用ICanHaz和胡须模板,但这对我的问题并不重要

在列表之间拖动项目时,如何最好地实现集合的自动更新(从一个集合中删除模型并将其插入到另一个集合中)?我目前正试图在jQueryUI可排序交互中使用receive和remove方法——至少我说的对吗

var WS = {};

(function(ns) {
    ns.Item = Backbone.Model.extend();

    ns.Content = Backbone.Collection.extend({
        model: ns.Item,
        url: location.href,
        initialize: function(el) {
            this.el = $(el);
            this.deferred = this.fetch();
        },
        recalculate: function() {
            var count = this.length;
            this.el.next(".subtotal").html(count);
        },
        setOrder: function() {
            $.ajax({
                url: this.url + "/reorder",
                type: "POST",
                data: "tasks=" + $(this.el).attr("id") + "&" + this.el.sortable("serialize")
            });
        }
    });

    ns.ContentRow = Backbone.View.extend({
        tagName: "li",
        className: "item",
        events: {
            "click .delete":  "destroy"
        },
        initialize: function(options) {
            _.bindAll(this, "render", "destroy");
            this.model.bind("change", this.render);
            this.model.view = this;
        },
        render: function() {
            var row = ich.item(this.model.toJSON());
            $(this.el).html(row);
            return this;
        },
        destroy: function() {
            if (confirm("Really delete?")) {
                this.model.destroy({
                    success: function(model, response) {
                        $(model.view.el).remove();
                    },
                    error: function(model, response) {
                        console.log(response);
                    }
                });
            }
        }
    });

    ns.ListView = Backbone.View.extend({
        initialize: function(collection) {
            this.el = collection.el;
            this.collection = collection;

            this.collection.bind("add", this.addOne, this);
            _.bindAll(this, "addOne");

            this.el.sortable({
                axis: "y",
                connectWith: ".tasks",
                receive: _.bind(function(event, ui) {
                    // do something here?
                }, this),
                remove: _.bind(function(event, ui) {
                    // do something here?
                }, this),
                update: _.bind(function(event, ui) {
                    var list = ui.item.context.parentNode;
                    this.collection.setOrder();
                }, this)
            });
        },
        insert: function(item) {
            var prefix = this.el.parentsUntil('ul').parent().attr("id"),
                view = new ns.ContentRow({
                    model: item,
                    id: prefix + "_" + item.id
                });

            this.el.append(view.render().el);
        },
        addOne: function(item) {
            if (item.isNew()) {
                item.save({}, {
                    success: _.bind(function(model, response) {
                        // I should set id from JSON response when live
                        model.set({ id: this.collection.length });
                        this.insert(model);
                    }, this)
                });
            } else {
                this.insert(item);
            }
        },
        addAll: function() {
            this.collection.each(this.addOne);
        },
        render: function() {
            this.collection.deferred.done(_.bind(function() {
                this.addAll();
            }, this));
        }
    });

    ns.AppView = Backbone.View.extend({
        lists: [],
        initialize: function(holder) {
            holder.find("ul").each(_.bind(function(index, list) {
                var Items = new WS.Content(list),
                    App = new WS.ListView(Items);

                App.render();

                this.lists.push(Items);
            }, this));
        }
    });

})(WS);

$(document).ready(function() {
    var App = new WS.AppView($("#tasks"));
});

你在正确的轨道上。您可能希望将每个可排序元素的id添加到模板的某个位置。然后,当您收到事件时,您就知道要从集合中添加或删除哪个模型。例如添加

<div data-id={{id}}> ... my thing ... </div>
。。。我的东西。。。
在可排序调用中,获取目标的id属性和调用集合。add()或remove()

只需使用。。它有这个功能内置的开箱即用

var listView = new Backbone.CollectionView( {
  el : $( "#list1" ),
  sortable : true,
  sortableOptions : {
      connectWith : "#list2"
  },
  collection : new Backbone.Collection
} );

var listView = new Backbone.CollectionView( {
  el: $( "#list2" ),
  sortable : true,
  sortableOptions : {
      connectWith : "#list1"
  },
  collection : new Backbone.Collection
} );