2

我正在研究 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”对象。例如,假设我想创建两个“Person”对象。Durandal/RequireJS 将愉快地加载到我的“Person”模块中,但它只是一个对象——我可能想要创建另一个“Person”类型的实例,或者另外五个实例,等等。

这样做的适当方法是什么?感谢您帮助消除我的困惑!

更新:我收到了一些回复,解释了一些方法来做到这一点。我认为我的困惑源于“模块”不是“类型”或“类”这一事实。它更像是一个单例对象。所以如果你想定义一个类型,并把它放在一个模块中,你需要创建一个模块,本质上就是一个工厂

那正确吗?

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

4

2 回答 2

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();
});
于 2013-05-14T18:38:40.287 回答
1

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

person-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
    }
});
于 2013-05-14T17:44:29.743 回答