65.9K
CodeProject 正在变化。 阅读更多。
Home

BackBone 教程 - 第二部分:理解 BackBone 模型的基础

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.97/5 (24投票s)

2014年7月12日

CPOL

4分钟阅读

viewsIcon

77850

downloadIcon

1310

在本文中,我们将讨论 Backbone 模型的基础知识。

引言

在本文中,我们将讨论 Backbone 模型的基础知识。

背景

当我们谈论任何 MV* 模式时,模型无疑是架构/应用程序中最重要的部分。模型包含了所有应用程序数据。除了存储数据,模型类还对数据执行各种操作。操作包括:验证数据的可能性、持久化数据的可能性、定义对模型中包含的各种数据部分的访问(访问控制)。

就构建 backbone.js 应用程序而言,Backbone.js 模型也是最重要的构建块。它跟踪应用程序数据,对数据执行验证,并提供一种机制来将数据持久化到本地的 localstorage 或通过 Web 服务远程到服务器。

完整系列链接

  1. BackBone 教程 – 第一部分:Backbone.Js 简介[^]
  2. BackBone 教程 – 第二部分:理解 Backbone 模型的基础[^]
  3. BackBone 教程 – 第三部分:更多关于 Backbone 模型的内容[^]
  4. BackBone 教程 – 第四部分:使用 HTTP REST 服务对 BackboneJs 模型进行 CRUD 操作[^]
  5. BackBone 教程 – 第五部分:理解 Backbone.js 集合[^]
  6. BackBone 教程 – 第六部分:理解 Backbone.js 视图[^]
  7. BackBone 教程 – 第七部分:理解 Backbone.js 路由和历史[^]
  8. BackBone 教程 – 第八部分:理解 Backbone.js 事件[^]

创建一个简单的 backbone.js 模型

要创建 backbone 模型,我们只需扩展 backbone 模型类。下面的代码片段展示了如何做到这一点。

var Book = Backbone.Model.extend({
   
});

此外,如果我们想创建一个继承自我们 model 类的模型,那么我们只需要继承自我们的 model 类。

var ChildrensBook = Book.extend({
   
});

实例化一个模型

Backbone 模型可以通过使用 new 关键字来简单实例化。

var book = new Book();

删除一个模型

要删除模型,我们只需在模型上调用 destroy 函数。

book.destroy();

有时,删除一个 model 可能需要一些时间(取决于 model 的大小)。在这种情况下,我们可以定义一个函数,当 model 被成功删除时会被调用。

book.destroy({
    success: function () {
        alert("The model has been destroyed successfully");
    }
});

克隆一个模型

我们经常需要一个深度复制的对象或模型的克隆。要创建 backbone 模型的克隆,我们只需调用 clone 方法。

function cloneModel() {
    var book = new Book();

    var book2 = book.clone();
}

如何指定模型属性

Backbone 模型不会强制在模型定义本身中定义属性,也就是说,可以创建一个模型并在需要时指定属性。比如说,我们想在 Book 模型中创建两个属性。让我们尝试在需要时创建它们。

var book = new Book({
    ID: 1,
    BookName: "Sample book"
});

模型属性的默认值

现在,在需要时创建属性得到了 backbone 模型的支持,这是一个非常强大的功能。但对于大规模应用程序来说,这个功能实际上会导致维护噩梦。从可维护应用程序的角度和最佳实践的角度来看,我希望能够在我自己的模型定义中定义我的模型属性。

为了实现这一点,可以使用 defaults 函数。defaults 函数用于指定模型的默认属性及其默认值。现在让我们尝试将属性移到模型定义中。

var Book = Backbone.Model.extend({
    defaults: {
        ID: "",
        BookName: ""
    },    
});

这样,仅仅实例化模型就足够了,创建的模型将与这些属性相关联。

设置和获取模型属性

一旦我们指定了模型属性,我们还需要能够获取和设置它们的值。为此,我们可以使用模型上的 getset 函数。

var book = new Book();

book.set("ID", 3);
book.set("BookName", "C# in a nutshell");

var bookId = book.get('ID');
var bookName = book.get('BookName');

如何检查属性是否存在

由于 backbone 允许我们在需要时添加属性,我们需要一种方法来识别特定属性是否存在于 model 中。为此,我们可以使用 model 上的 has 函数。

book.has('ID');      // true
book.has('author');  // false

在模型中定义函数

我们也可以在 model 类中定义我们的函数。让我们尝试在我们的 model 类中创建一个简单的函数。

var Book = Backbone.Model.extend({
    defaults: {
        ID: "",
        BookName: ""
    },

    showAlert: function () {
        alert('ID: ' + this.get('ID') + ', BookName: ' + this.get('BookName'));
    }
});

initialize 函数

每当我们创建一个 model 时,backbone 都会调用它的 initialize 函数。我们可以覆盖这个函数来提供自定义行为。

var Book = Backbone.Model.extend({
    defaults: {
        ID: "",
        BookName: ""
    },

    initialize: function(){
        console.log('Book has been initialized');
    },

    showAlert: function () {
        alert('ID: ' + this.get('ID') + ', BookName: ' + this.get('BookName'));
    }
});

监听模型属性变化

我们还可以使用事件来监听模型变化。这可以通过监听 change 事件来完成。每当 model 属性发生变化时,Backbone 就会触发一个 change 事件。对于每个属性,我们可以使用 hasChanged 方法来检查该属性是否已更改。让我们尝试将事件处理程序挂钩以监听当前模型中的模型更改。

var Book = Backbone.Model.extend({
    defaults: {
        ID: "",
        BookName: ""
    },

    initialize: function(){
        console.log('Book has been initialized');

        // Lets hook up some event handers to listen to model change
        this.on('change',  function() {
            if(this.hasChanged('ID')){
                console.log('ID has been changed');
            }
            if(this.hasChanged('BookName')){
                console.log('BookName has been changed');
            }
        });
    },

    showAlert: function () {
        alert('ID: ' + this.get('ID') + ', BookName: ' + this.get('BookName'));
    }
});

如果我们有很多属性,并且我们有兴趣监听任何特定属性的变化,那么也许我们也可以在 change 事件绑定中指定它。让我们尝试只监听 BookName 的变化。

var Book = Backbone.Model.extend({
    defaults: {
        ID: "",
        BookName: ""
    },

    initialize: function () {
        console.log('Book has been initialized');

        // Lets hook up some event handers to listen to model change
        this.on('change:BookName', function () {
            console.log('Message from specific listener: BookName has been changed');
        });
    },

    showAlert: function () {
        alert('ID: ' + this.get('ID') + ', BookName: ' + this.get('BookName'));
    }
});

看点

这就是本篇博客的全部内容。本文的目的是让大家熟悉 backbone 模型的基本概念。在下一篇文章中,我们将探讨与 backbone 模型相关的更高级的主题。本文是从初学者的角度撰写的,希望有所帮助。

© . All rights reserved.