在骨干中,您是否在实例化之前定义了模型的属性?

时间:2013-12-26 19:45:25

标签: javascript backbone.js

我正在学习backbone.js。在various tutorials中,他们通过扩展Backbone.Model

来定义特定的主干模型

例如:

Person = Backbone.Model.extend({
    initialize: function(){
        alert("Welcome to this world");
    }
});

我对一个基本点感到有点困惑:在骨干中,你是否提前定义了模型的属性?例如,您是否可以定义一个只能有两个字段的人物模型:姓名和年龄?

根据我创建Java或C#类的经验,我希望您定义与模型关联的属性的方式与定义与对象关联的字段的方式非常相似。但这似乎并不是backbone.js的工作方式。您似乎通过在实例化期间设置这些属性来定义与模型关联的属性。例如,您可以通过实例化实例并设置这些字段来在人员模型中创建年龄和名称字段。 var person = new Person({ name: "Thomas", age: 67});正确吗?

相关地,你能用javascript对象做到这一点吗?我知道javascript被解释并且没有编译,因此没有编译时检查类中的哪些字段被设置/访问 - 但我认为可以进行运行时检查。

2 个答案:

答案 0 :(得分:3)

如果您需要设置一些默认值,则只能将属性定义为模型定义的一部分:

Person = Backbone.Model.extend({
    defaults: {
        "species": "homo sapiens"
    },

    initialize: function () {
        alert("Welcome to this world");
    }
});

除此之外,属性将只是您放入模型的任何对象的属性。所以这是一个例子:

var examplePerson =  new Person({ firstName: "Johnny", lastName: "Smith", age: 30 });

现在firstName,lastName,age和species是模型实例的属性。如果要对所设置的值进行验证,请为Backbone的validate方法提供实现。

答案 1 :(得分:1)

Backbone鼓励使用其setter和getter函数 .set .get 。如果属性发生变化an event is fired on the model,每次使用setter时,以这种方式执行此操作都有一些好处。通过这种方式,视图(或其他模型或其他)可以监听模型并对属性变化做出反应。

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

   var myCar = new Car({tires:0});

   myCar.listenTo(myCar, 'change:tires', function(){
       console.log('Now with '+myCar.get('tires'));
   }, this);

   myCar.set({tires: 4}); //logs "Now with 4"

要直接访问这些属性(不推荐),您可以访问模型的属性对象。当然,您仍然可以通过使用 model.myAttribute = myValue 或其他类似的东西在此方法之外设置自己的属性,但这不会触发事件。

  myCar.tires = 3;
  myCar.get('tires'); // still 4

Backbone属性在几个不同的时间实例化。主要方法是 .set 方法,它接受一个JSON对象,遍历键并保存值。此函数用于实例化新模型,与服务器同步/获取,以及手动调用它时。要调整实例化值,只需将代码添加到 initialize 方法中,摆弄服务器响应,将代码添加到模型的解析方法中。

如果要为某些属性设置默认值,可以通过为模型定义默认对象来实现。无论如何,我喜欢不必手动设置属性,这样如果我想调整我的API,更改将很好地通过。如果您不想允许某些属性,则可以始终从 initialize 方法中的属性中删除它们。