我正在使用Durandal构建应用程序,我需要在视图模型之间共享一些功能。
我有5个屏幕要构建,它们几乎都是相同的屏幕,除了在激活功能中它们将调用不同的api端点,否则视图和视图模型将是相同的。
我是否应该遵循这样的模式来正确地构造它以促进代码重用?
答案 0 :(得分:4)
如果视图和视图模型除了调用不同的api动作之外是相同的,那么只需将参数作为路径的一部分接收?然后在激活功能中,您可以打开参数。可以指定路线值,以便您的网址相关,例如[http://site/page/subtype],其中子类型是参数(而不是使用数值)
关于继承,根据您需要的功能,有很多方法可以进行JavaScript继承,这可能有点令人困惑。有一些由base2和Prototype等库提供的全功能继承模型。我已成功使用的John Resig also has an inheritance model。
总的来说,在JS继承方面,我更倾向于使用更简单的解决方案。如果您需要几乎完整的继承功能集,那么这些库是值得考虑的。如果您真的只关心从基类访问一组属性和函数,那么您可以将视图模型定义为函数,并将函数的原型替换为所需的基类。有关继承的详细信息,请参阅Mozilla's Developer Docs。
以下是一个示例:
//viewModelBase
define(function (require) {
"use strict";
function _ctor() {
var baseProperty = "Hello from base";
function baseFunction() {
console.log("Hello from base function");
}
//exports
this.baseProperty = baseProperty;
this.baseFunction = baseFunction;
};
//return an instance of the view model (singleton)
return new _ctor();
});
//view model that inherits from viewModelBase
define(function (require) {
"use strict";
function _ctor() {
var property1 = "my property value";
function activate() {
//add start up logic here, and return true, false, or a promise()
return true;
}
//exports
this.activate = activate;
this.property1 = property1;
};
//set the "base"
var _base = require("viewModelBase");
_ctor.prototype = _base;
_ctor.prototype.constructor = _ctor;
//return an instance of the view model (singleton)
return new _ctor();
});
请记住这个例子所有结果都是有效的单身人士(即你只会获得相同的实例,无论你需要多少次()它)
如果你想要一个瞬态(非单身),只需返回_ctor。然后,在需要()之后,您需要实例化一个新实例。
还有一点需要注意,一般来说,函数应该在原型上定义,而不是在构造函数本身内定义。见this link for more information on why。因为这个例子只产生一个实例,所以它是一个没有实际意义的点,因此函数在构造函数内部以提高可读性,并且还能够访问私有变量和函数。