如何在AMD / RequireJS样式中定义“类型”

时间:2013-05-14 16:52:05

标签: javascript mvvm requirejs amd durandal

我正在开发Durandal SPA,我已经设置了一些视图和视图模型。我不清楚我应该如何在客户端创建“模型”对象。例如,假设我想定义并创建“Person”模型对象。

我的应用程序中的其他所有内容都定义为AMD风格。这允许Durandal / RequireJS自动加载它所需的文件。

所以,我的第一个想法是我可以在models / person.js文件中定义我的“Person”模型类型,如下所示:

define(function () {
    var id = ko.observable(0);
    var firstname = ko.observable('');
    var lastname = ko.observable('');

    return = {
        id: id,
        firstname: firstname,
        lastname: lastname,
    };
});

但是,我不认为这是对的,因为从这里我认为没有办法真正创建单独的“人物”对象。例如,假设我想创建两个“Person”对象。 Durandal / RequireJS将很乐意加载我的“Person”模块,但它只是一个对象 - 我可能想要创建另一个“Person”类型的实例,或者另外五个实例等。

这样做的恰当方法是什么?感谢您帮助解决我的困惑!

更新:我已经得到了一些回复来解释一些方法。我认为我的困惑源于“模块”不是“类型”或“类”的事实。它更像是singleton object。因此,如果要定义类型并将其放在模块中,则需要创建基本上为factory的模块。

是吗?

在这种情况下工厂是有道理的。但是,我有一个澄清的问题:这是一个工厂,在Durandal / RequireJS / AMD风格的JavaScript应用程序中定义模型类型的公认方法吗?我敢肯定我不是第一个遇到这个问题的人。我想知道它之前是如何解决的,并且(特别是)如果在AMD世界中有关于如何定义可重用类型的公认惯例。

2 个答案:

答案 0 :(得分:3)

define(function () {

    return function(){
       var self = this;
       self.id = ko.observable(0);
       self.firstname = ko.observable('');
       self.lastname = ko.observable('');
    };
});

define(['models/person'], function(person){
    var myPerson = new person();
});

答案 1 :(得分:1)

“人”听起来并不像一个可以变成模块的概念,但是“PersonFactory”怎么样?

<强>人-factory.js

define(['knockout'], function (ko) {
    return {
        spawnPerson: function () {
            var id = ko.observable(0);
            var firstname = ko.observable('');
            var lastname = ko.observable('');

            return {
                id: id,
                firstname: firstname,
                lastname: lastname,
            }
        }
    }
});

它可以通过以下方式用于另一个模块:

<强>做出头与 - person.js

define(['person-factory'], function (PersonFactory) {
    var newPerson = PersonFactory.spawnPerson();

    return {
        // do something with newPerson
    }
});