模型记录在Spine.js中排序

iri*_*ium 5 model-view-controller javascript-framework spine.js

正如我在Spine.js源代码中看到的那样,Model.each()函数按照ID的顺序返回Model的记录.在订购很重要的情况下,这是完全不可靠的:长人名单等.

你能建议一种方法来保持原始记录的排序(按照它们通过refresh()或类似功能到达的顺序)吗?

PS事情甚至更糟,因为默认情况下Spine.js在内部使用新的GUID作为ID.所以记录顺序是完全随机的,这是不可接受的.

编辑:似乎在上次提交https://github.com/maccman/spine/commit/116b722dd8ea9912b9906db6b70da7948c16948a
他们使它成为可能,但我没有自己测试,因为我从Spine切换到Knockout.

小智 2

在学习 spin.js 时遇到了同样的问题。我使用的是纯 JS,所以我忽略了联系示例http://spinejs.com/docs/example_contacts,它对这个问题有所帮助。事实上,你不能真正以这种方式保留服务器的排序,但你可以使用 javascript 进行自己的排序。

请注意,我在这里使用元素模式。(http://spinejs.com/docs/controller_patterns)

首先,设置将在模型内进行排序的函数:

/*Extending the Student Model*/
Student.extend({

    nameSort: function(a,b) {
        if ((a.name || a.email) > (b.name || b.email)) 
            return 1; 
        else 
            return -1
    }
});
Run Code Online (Sandbox Code Playgroud)

然后,在学生控制器中使用排序设置元素:

/*Controller that manages the students*/
var Students = Spine.Controller.sub({

           /*code ommited for simplicity*/

            addOne: function(student){
            var item = new StudentItem({item: student});
            this.append(item.render());
    },

    addAll: function(){
            var sortedByName = Student.all().sort(Student.nameSort);
            var _self = this;
            $.each(sortedByName, function(){_self.addOne(this)});
    },


});   
Run Code Online (Sandbox Code Playgroud)

就是这样。