Javascript 使用Durandal时查看模型继承

Javascript 使用Durandal时查看模型继承,javascript,single-page-application,durandal,Javascript,Single Page Application,Durandal,我正在使用Durandal构建一个应用程序,我需要在视图模型之间共享一些功能 我有5个屏幕要构建,它们实际上都是相同的屏幕,除了在activate函数中,它们将调用不同的api端点,但在其他方面,视图和视图模型将是相同的 我是否应该遵循一种模式来正确地构造它以促进代码重用?如果视图和视图模型除了调用不同的api操作之外是相同的,那么仅仅将参数作为路由的一部分如何?然后在激活功能中,您可以打开参数。可以指定路由值以使url相关,如[,其中子类型是参数(而不是使用数值) 关于继承,根据您需要的功能,

我正在使用Durandal构建一个应用程序,我需要在视图模型之间共享一些功能

我有5个屏幕要构建,它们实际上都是相同的屏幕,除了在activate函数中,它们将调用不同的api端点,但在其他方面,视图和视图模型将是相同的


我是否应该遵循一种模式来正确地构造它以促进代码重用?

如果视图和视图模型除了调用不同的api操作之外是相同的,那么仅仅将参数作为路由的一部分如何?然后在激活功能中,您可以打开参数。可以指定路由值以使url相关,如[,其中子类型是参数(而不是使用数值)

关于继承,根据您需要的功能,JavaScript继承有很多方法,可能会有点混乱。base2和Prototype等库提供了一些功能齐全的继承模型。我已经成功地使用了这些模型

一般来说,在JS继承时,我更倾向于坚持更简单的解决方案。如果你需要一组相当多的继承特性,那么这些库是很好的考虑因素。如果你真的只关心从基类访问一组属性和函数,那么你可能只需定义视图模型就可以了。一个函数,并用所需的基类替换函数的原型。有关继承的详细信息,请参阅

以下是一个示例:

 //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。然后您需要在需要它之后实例化一个新实例


还有一点需要注意的是,一般来说,函数应该在原型上定义,而不是在构造函数本身中定义。请参阅。因为此示例只生成一个实例,所以这是一个没有实际意义的点,因此函数位于构造函数内,以提高可读性以及访问私有变量和函数的能力。

如果除了调用不同的api操作外,IEW和视图模型是相同的,那么仅仅将一个参数作为路由的一部分如何?然后在activate函数中,您可以打开该参数。可以指定路由值,以便url是相关的,例如[,其中subtype是参数(而不是使用数值)

关于继承,根据您需要的功能,JavaScript继承有很多方法,可能会有点混乱。base2和Prototype等库提供了一些功能齐全的继承模型。我已经成功地使用了这些模型

一般来说,在JS继承时,我更倾向于坚持更简单的解决方案。如果你需要一组相当多的继承特性,那么这些库是很好的考虑因素。如果你真的只关心从基类访问一组属性和函数,那么你可能只需定义视图模型就可以了。一个函数,并用所需的基类替换函数的原型。有关继承的详细信息,请参阅

以下是一个示例:

 //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。然后您需要在需要它之后实例化一个新实例


还有一点需要注意的是,一般来说,函数应该在原型上定义,而不是在构造函数本身中定义。请参阅。因为此示例只生成一个实例,所以这是一个没有实际意义的点,因此函数位于构造函数内,以提高可读性以及访问私有变量和函数的能力。

看一下durandal的样本文件夹,看一下masterDetail样本。我想这可能与你所说的相似。我会看一下durandal的样本文件夹,看一下masterDetail样本。我想这可能与你所说的相似。谢谢你的建议,这是一个很好的观点。它会在sc中传播enario我做了概述。不过我真的很想知道如何在视图模型中实现继承。我编辑了一些专门关于继承的附加信息。非常感谢@heiserman,非常有用,在那里学到了很多东西。你介意发布viewModelBase的样子吗?没问题。我添加的代码越多,我就越喜欢它我最好测试它,所以我做了。因此,在原始版本中有一些调整,但这段代码在Durandal应用程序中确实有效。感谢您的建议,这是一个很好的观点。它将绕过我概述的场景。不过,我真的很想知道如何在视图模型中实现继承。编辑以包含一些额外的info特别是关于继承。非常感谢@heiserman,非常有帮助,在那里学到了很多东西。你介意发布viewModelBase的外观吗?没问题。我添加的代码越多,我越觉得最好测试它,所以我就这么做了。因此,在原始版本中有一些调整,但这段代码在Durand中确实有效艾尔应用程序。