什么是Backbone.js或其他MVC提供

What does Backbone.js or other MVC offer?

本文关键字:其他 MVC 提供 js Backbone 什么      更新时间:2023-09-26

我从backbone.js开始

浏览一些教程,如下所示。我有一种感觉,它更多的是关于如何组织你的对象,以及如何指导它们相互作用。不用backbone。js我也能做所以对我来说,backbone.js看起来更像是一套规则和哲学,而不是一个真正的插件。是这样吗?

(function($){
  var Item = Backbone.Model.extend({
    defaults: {
  part1: 'hello',
  part2: 'world'
  }
 });      
 var List = Backbone.Collection.extend({
    model: Item
 });
var ListView = Backbone.View.extend({
el: $('body'),
events: {
  'click button#add': 'addItem'
},
   initialize: function(){
  _.bindAll(this, 'render', 'addItem', 'appendItem'); // remember: every function that uses 'this' as the current object should be in here
  this.collection = new List();
  this.collection.bind('add', this.appendItem); // collection event binder
  this.counter = 0;
  this.render();      
},
render: function(){
  $(this.el).append("<button id='add'>Add list item</button>");
  $(this.el).append("<ul></ul>");
  _(this.collection.models).each(function(item){ // in case collection is not empty
    appendItem(item);
  }, this);
},
// `addItem()` now deals solely with models/collections. View updates are delegated to the `add` event listener `appendItem()` below.
addItem: function(){
  this.counter++;
  var item = new Item();
  item.set({
    part2: item.get('part2') + this.counter // modify item defaults
  });
  this.collection.add(item); // add item to collection; view is updated via event 'add'
},
// `appendItem()` is triggered by the collection event `add`, and handles the visual update.
appendItem: function(item){
  $('ul', this.el).append("<li>"+item.get('part1')+" "+item.get('part2')+"</li>");
}
});
var listView = new ListView();
})(jQuery);

Backbone.js、underscore.js和jQuery(它们都是相互依赖的)是javascript之上的实用抽象层和工具集,允许您组织业务逻辑、模板和模型。

这样做的主要好处是代码的可读性(对于长期项目/有多个成员的项目),围绕离散部分的组织(例如,使HTML脱离业务逻辑)的一般良好实践,为项目中困难/有趣的部分提供时间,而不是在不同的浏览器兼容性问题上重新发明轮子,并且(在下划线的情况下)一个伟大的工具集来帮助你管理javascript对象,数组,函数等,用于安全合理的编程。

基本上,如果你选择不使用这些工具,你要么就是在做原型,要么就是有大把的时间。如果时间和理智是你喜欢的东西,不要害怕使用它们!

Backbone提供了更清晰的关注点分离,使您可以编写更清晰的代码。我使用jQuery编写了一个非常精细的富客户端。我必须直接在DOM元素上存储大量元数据。这意味着我还必须定期查询DOM元素以读取/使用该元数据。虽然你可以用现有的工具做任何事情,但有些工具会让事情变得更容易(也更干净)。

使用Backbone,您的模型存储所有相关信息。您不需要在DOM属性中存储那么多东西。每个模型只存在一次,所以对于任何一个事实(例如,给定人物模型的first_name),您都有一个单点事实,即模型本身。您使用模型来跟踪它自己的事实,而不是DOM。我保证你的代码会更干净。

Backbone不是万能的工具。当你在浏览器中表示模型(存在于后端数据库中的东西)时,使用它是有意义的。

你说对了,这主要是关于如何构建大型js应用程序的哲学,所有的管道都为你处理。

Backbone仍处于起步阶段,但它有很大的吸引力。即使你现在不太满意,我也会留意的。

我想说,Backbone.js提供的主要功能实际上是事件模型。是的,可以手工编写,因为它确实是一个简单的模型。

对于Spine.js,一个非常相似的库,我想说它提供的另一个特性是Class,一个javascript原型的包装器。

也就是说,我认为有一些重要的注意事项是您需要正确处理的。这些告诫除其他外:

  • 你的事件到底是什么时候触发的?
    • 是否像自动检测到Backbone.js的情况?
    • 或者你想要像在Spine.js中那样通过调用save()
    • 来显式地做到这一点
  • 如果有两个函数被触发响应一个事件,他们接收一个模型实例:
    • 它们是否接收到相同的实例-即其中一个所做的更改将立即对另一个可见
    • 或者他们收到了某种副本。如果副本:
      • 它们会对模型的未来变化做出反应吗,

有很多事情要做对。我肯定有偏见,因为我发现Backbone.js所做的选择非常麻烦。我显然更喜欢Spine.js。但是,我鼓励您为这两个库寻找一些重要的用例示例,并自己做出判断。

继续自己实现所有这些可能是正确的选择- Spine.js核心只有2KB的简化代码。然而,我强烈建议你试着从别人的错误中学习。在我看来,有很多地方是错误的。