我正在开发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世界中有关于如何定义可重用类型的公认惯例。
答案 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
}
});