Knockout.js observableArray vs Backbone.js Collection - 有什么区别?

时间:2012-01-05 19:01:36

标签: javascript backbone.js knockout.js

在Knockout.js中,我创建了一个observableArray来将模型推送到:

function Room(data) {
        this.name = ko.observable(data.name);

    }   


    function RoomViewModel() {      
        var self = this;
        self.rooms = ko.observableArray([]);
        self.newRoomText = ko.observable();         

        self.addRoom = function() {
            self.rooms.push(new Room({ name: this.newRoomText() }));
            self.newRoomText("");       
            $("#modal").dialog("close");        
        }.bind(self);           
    }

在Backbone.js中,我会创建一个集合来存储我的模型:

var Book = Backbone.Model.extend();

var Books = new Backbone.Collection([
  {name: "Abe Lincoln - Vampire Hunter"}
  {name: "Pride and Prejudice and Zombies"}
]);

这两种结构彼此有多么不同?

为了使这些数据结构与标准Javascript数组不同,幕后究竟发生了什么?

1 个答案:

答案 0 :(得分:9)

这是一个难以完全回答的问题,但这是我对此的看法:)。

Backbone.js Collection

  • 从服务器获取模型
  • 触发更改/添加/删除事件
  • 收听模型事件并在集合上触发它们
  • 自动验证模型
  • 许多用于处理集合的跨浏览器方便性方法(每个,最大,排序,减少等)

Knockout.js observableArray

  • 跟踪添加和删除的元素 - 自动更新UI
  • 数组方法的跨浏览器实现(例如IE8存在问题w / native .indexOf()
  • 时髦destroy& Rails开发人员的destroyAll方法将对象的_destroy属性设置为true - 这将通知Rail的ActiveRecord应删除哪些对象。

Backbone.Collection正在使用Backbone.js框架和observableArray仅使用Knockout.js。在隔离中将它们相互比较是没有实际意义的,因为它们是框架的一部分,如果您的应用程序是在Backbone上构建的,则不能使用observableArray,反之亦然。

如果您想知道幕后发生的究竟,那么这里是源代码: