`
zhouyrt
  • 浏览: 1173079 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Backbone模型

阅读更多

现在进入最关键的组件 - 模型。模型用来存储应用的所有数据,以及直接和数据操作相关的逻辑。Backbone中的模型类是Backbone.Model,它包含了数据存储,数据验证,以及数据发生变动时触发相关动作。

一般可以把模型与后端绑定(ORM),模型改变的同时向后端发起请求(Ajax)更新数据(数据库)。也有把模型和DOM元素绑定,模型改变时更新HTML界面。

 

一、模型

可以直接new一个Backbone.Model,它返回一个Model

var model = new Backbone.Model()
model.set({name: 'Backus', age: 35})

也可扩展Backbone.Model,定义自己的模型类(构造器)

var Person = Backbone.Model.extend({
    initialize: function(name, age) {
        this.set({name: name, age: age})
    }
})

extend的第一个参数为一个对象,它将成为模型实例的属性。第二个参数将成为类属性(类静态属性、方法)。这在 Backbone的写类方式 有所提及。

 

二、模型与属性 - set/get

使用set和get方法来设置或获取模型的属性。属性在模型实例上有一个专门的属性来存储:this.attributes,set/get都围绕this.attributes操作。

 

设置模型Person的属性

var p1 = new Person()
p1.set({name: 'Backus', age: 87})

 

Firefox控制台使用get方法获取属性


set方法除了可以接受对象形式参数,也可以接受前两个key,value方式


 

set方法内部对此做了兼容,第一个参数key如果是对象类型,直接将该对象拷贝到this.attributes上,如果key是字符串,那么将在内部把key,value转成一个临时对象attrs再拷贝到this.attributes上。

 

set还有第三个可选参数options,如果设置了options.validate=true,且模型如果定义了validate方法,那么每次设置时将调用该方法进行校验,校验未通过将不进行后续设置,而直接返回。

var Person = Backbone.Model.extend({
    validate: function(attrs) {
        if ( !_.isString(attrs.name) ) return 'name 必须是字符串类型'
        if ( !_.isNumber(attrs.age) ) return 'age 必须是数字类型'
    }
})
var p1 = new Person()
p1.on('invalid', function(model, error, agr) {
    console.log(error)
})
p1.set({name: 'Backus', age: 87})

 

从控制台输入如下



可以看到输出了提示信息“name 必须是字符串类型”,再打印出p1的JSON格式



可以看到name仍然是“Backus”,并未修改。

 

在set方法内部会调用私有的this._validate方法,该方法如下

_validate: function(attrs, options) {
  if (!options.validate || !this.validate) return true;
  attrs = _.extend({}, this.attributes, attrs);
  var error = this.validationError = this.validate(attrs, options) || null;
  if (!error) return true;
  this.trigger('invalid', this, error, _.extend(options, {validationError: error}));
  return false;
}

1.0与之前版本实现不同,必须显示的设置options.validate=true,且模型必须实现this.validate方法,才会进行验证,否则直接返回true。1.0之前默认就进行验证,无需设置options.validate为true。验证无效(失败)后会派发“invalid”事件,因此可以监听该事件做后续处理,比如显示一些必要的提示信息。

 

默认情况下,set调用都会触发“change”事件,如下

p1.on('change', function(model, error) {
    console.log('attributes has changed')
})
p1.set({name: 'Backus', age: 87})

你可以在回调函数中去更新视图或处理特定的业务逻辑。如果你显示设置第三个参数中silent为true,将不会触发“change”事件。

p1.set({name: 'Backus', age: 87}, {silent: true})

从set源码可以看到,this._validate执行在前,this.trigger在后。也就是说如果验证失败,那么就不会执行change事件。

 

附set方法执行流程图

 
三、把模型保存到服务器 - save

save方法会把模型保存到服务器端,它的参数和set完全一致。内部调用set和sync方法。

以下几点需要注意

1. 默认会进行属性校验,即options.validate为true,校验失败将不会请求后台程序,也不会设置模型的this.attributes,直接返回,见源码

if (attrs && !options.wait) {
  if (!this.set(attrs, options)) return false;
} else {
  if (!this._validate(attrs, options)) return false;
}

  

2. 首次保存时(isNew),会采用create方式(HTTP post),已存在的model则只需要update方式(HTTP put)

如下

var p1 = new Person()
p1.save({name: 'Backus', age: 87}) // create
p1.save({name: 'John'}) // update

3. 可以传success和error两个回调函数以处理保存成功与失败场景

var p1 = new Person()
p1.save({name: 'Backus', age: 87}, {
    success: function() {},
    error: function() {}
})

4. 事件,save成功后会依次触发模型的“change”、“request”、“sync”事件。如果监听了这些事件,那么回调将得到执行

 

四、从服务器获取模型 - fetch

从服务器端获取使用fetch方法,fetch方法很短

fetch: function(options) {
  options = options ? _.clone(options) : {};
  if (options.parse === void 0) options.parse = true;
  var model = this;
  var success = options.success;
  options.success = function(resp) {
    if (!model.set(model.parse(resp, options), options)) return false;
    if (success) success(model, resp, options);
    model.trigger('sync', model, resp, options);
  };
  wrapError(this, options);
  return this.sync('read', this, options);
},

1. 它使用read方式(HTTP get)

2. 请求成功后调用set方法设置模型属性(this.attributes),设置失败则直接返回不调用success,设置成功接着调用success,最后派发“sync”事件

 

五、模型的事件 - change/invalid/sync

上面已经提到的事件 change、 invalid、sync。change事件还可以只监听指定的属性,格式:"change:" + attributeName。如下

var p1 = new Person()
p1.on('change:name', function(model, error) {
    console.log('name has changed')
})

控制台中分别设置下name和age




可以看到,只有设置name时才触发事件。

 

除了Backbone.Model自身提供的事件,你还可以给自己的Model添加自定义的事件以满足需求。

 

六、鸟瞰图

1. 内部状态,各属性影响的方法



 

2. 构造器执行流程



 

pp

  • 大小: 42.2 KB
  • 大小: 7.6 KB
  • 大小: 13.6 KB
  • 大小: 10 KB
  • 大小: 8 KB
  • 大小: 59.2 KB
  • 大小: 21.7 KB
  • 大小: 62.5 KB
  • 大小: 57.6 KB
分享到:
评论

相关推荐

    backbone-schema:Backbone 模型的简约模式验证器

    用于 Backbone 模型的简约轻量级模式验证器。 受到松散启发。 随意分叉、修改并满足您的需求。 欢迎请求请求和问题。 npm install backbone-schema 用法 可以在浏览器或服务器中使用。 只需在您的项目中包含主干...

    backbone.hashmodels:将多个 Backbone 模型连接到 url 哈希

    主干.hashmodels 将多个 Backbone 模型连接到 url 哈希概述在大型单页 Web 应用程序中,您通常会有多个 UI 小部件来调整页面内容(过滤可见项目、更改排序顺序、设置颜色首选项、选择项目等)。如果您想保存和恢复...

    backbone.caching-fetcher:一个 Backbone 插件,用于缓存获取 Backbone 模型和集合的结果

    一个 Backbone 插件,用于缓存获取 Backbone 模型和集合的结果。 主要用例:如果您很少更改应用程序不同部分所需的集合或模型集,则只能获取一次。 Caching-fetcher 使您无需检查集合中的任何项目是否已获取。 ...

    rotten-tomatoes-backbone:如何使用Rotten Tomatoes API填充Backbone模型的示例

    在这个"rotten-tomatoes-backbone"项目中,我们将学习如何利用Rotten Tomatoes API的数据来填充Backbone模型,从而构建一个功能丰富的电影信息展示应用。以下是这个示例中的关键知识点: 1. **Backbone.Model**:...

    backbone-localizable-texts:在 Backbone 模型中具有本地化字段的简单方法

    `backbone-localizable-texts` 是一个专门为Backbone.js框架设计的库,它提供了一种在Backbone模型中处理本地化字段的简便方法。这个库主要面向JavaScript开发者,帮助他们在Backbone应用中轻松地实现国际化功能。 ...

    BackboneGit:将 Backbone 模型提交到服务器时管理冲突

    **BackboneGit: 将Backbone模型提交到服务器时管理冲突** BackboneGit是一个解决方案,旨在帮助开发者在使用Backbone.js框架时处理模型与服务器之间的数据同步问题,特别是在并发更新可能导致冲突的情况下。...

    Backbone.Rel:Backbone.Rel通过轻量级的关系管理器扩展了Backbone模型

    骨干角色 Backbone.Rel通过轻量级的关系管理器扩展了Backbone模型。它是如何工作的? 原料药相对Backbone.Rel公开了一个关系getter的方法rel 。有很多您可以在Model实现hasMany方法来定义关系。 该方法必须返回一个...

    backbone_api_frame

    1. `models/` - 存放Backbone模型文件,每个模型对应后端的一个资源或数据对象。 2. `views/` - 包含Backbone视图文件,负责UI展示和用户交互。 3. `collections/` - 集合文件,用于管理一组相关的模型实例。 4. `...

    backparse:backparse是commonjs的实现,它将解析集成添加到了Backbone模型和集合中。 大量代码是从neebz的[backbone-parse](https

    后解析backparse是commonjs的实现,它将解析集成添加到了Backbone模型和集合中。 大量代码是从neebz的借用的。用法 // Load the `backparse` module instead of `backbone`. Pass in `appId`,// `apiKey` and `api...

    前端项目-backbone-relational.zip

    Backbone-relational 是一个扩展插件,专门用于处理Backbone模型间的一对一、一对多和多对一的关系。这个项目“前端项目-backbone-relational.zip”显然包含了使用Backbone-relational来管理复杂数据结构的代码实例...

    pvtv_backbone

    预训练的backbone模型已经在大规模数据集如ImageNet上进行了训练,因此具备了对通用图像特征的识别能力,这使得它们在各种下游任务中可以快速适应和取得良好的表现。 "deformable-DETR"是另一种基于Transformer的...

    Backbone标准例子——通讯录

    9. **RESTful API**:如果这个应用有后端支持,那么Backbone模型可能通过RESTful API与服务器进行数据交换,遵循HTTP方法(GET、POST、PUT、DELETE)来操作资源。 10. **最佳实践**:示例可能还会展示如何优雅地...

    backbone-model-collection-example

    **集合(Collection)** 是一组具有特定排序的Backbone模型对象,它扩展自`Backbone.Events`,因此可以像模型一样监听和触发事件。集合的主要功能包括: 1. **模型管理**:集合包含了多个模型实例,并维护它们的...

    backbone tutorials

    Backbone模型包含验证和同步机制,能够监听和响应数据的变化。开发者可以通过设置模型属性(attributes)、获取模型属性、设置默认值、操作数据、监听模型变化、与服务器交互、创建、更新和删除模型来操作模型。 ...

    前端项目-backbone-associations.zip

    这个项目的目的在于展示如何在Backbone模型中创建对象层次结构,并利用Backbone的事件系统来响应层次结构中的变化。 首先,让我们深入了解Backbone.js的核心概念: 1. **模型(Model)**:在Backbone中,模型是...

    深度学习预训练库,集成各种经典backbone,基于OpenMMLab_MMPretrain库!!!.zip

    "OpenMMLab-MMPretrain"是一个这样的库,它集成了多种经典的backbone模型,如ResNet、VGG、DenseNet、MobileNet等,这些模型在图像识别、目标检测、语义分割等多个任务中都有广泛的应用。 预训练库的核心在于预训练...

    前端项目-backbone-tastypie.zip

    1. **适配器**:实现了Backbone.sync方法的扩展,使得Backbone模型可以直接与Django Tastypie API进行交互,处理CRUD(创建、读取、更新、删除)操作。 2. **错误处理**:封装了API响应的错误处理,使前端能够优雅地...

    backbone_marionette_require

    另一个文件可能定义一个Backbone模型,用于存储和操作从服务器获取的数据。通过RequireJS,这些模块和类可以按需加载,减少初始加载时间,同时保持代码的清晰和独立。 总的来说,“backbone_marionette_require”...

    metronic-backbone

    1. **模型管理**:理解如何定义和使用Backbone模型来存储和同步数据,包括模型的属性、方法以及与服务器的交互。 2. **视图绑定**:学习如何创建Backbone视图,将它们绑定到特定的模型或集合,以及如何监听并响应...

Global site tag (gtag.js) - Google Analytics