我正在寻找一种更好的方法来处理我的 DurandalJS 应用程序中的继承,从baseViewModel.js
其他页面。这是我当前的应用程序结构:
- baseViewModel.js
- 主壳
- 第 1 组外壳
- 第 1 页
- 第2页
- 第 2 组外壳
- 第 1 页
- 第2页
- 第 1 组外壳
所有这些页面都有一些共同的功能(baseViewModel.js),例如:
- isLoading:用于检查页面上是否正在加载内容的 observable
- isValid:检查表单是否有效
- 添加和删除项目的 afterAdd 和 beforeRemove 效果
- 表单的键盘快捷键
- 模板切换功能
- ETC
目前如何运作
里面的所有东西都
baseViewModel.js
被声明为self.*
self 是对 Window 对象的引用,例如:self.showElement = function(elem) { if (elem.nodeType === 1) $(elem).hide().fadeIn(); } self.fadeRemove = function(elem) { if (elem.nodeType === 1) $(elem).fadeOut(500, function() { $(elem).remove(); }); }
我
baseViewModel.js
只在主 shell 中定义一次,然后通过应用程序访问它,如下所示:<tbody data-bind="foreach: { data: dataArr, afterAdd: showElement, beforeRemove: fadeRemove }">
或在视图模型内:
Page1.load = function() { self.isLoading(true); // get data };
我试过的
我研究了原型继承并设法让它工作,但我不确定我实现它的方式。我在Base
里面创建了一个函数baseViewModel.js
并将其作为单例返回。然后在其中一页内,我做了:
define(['durandal/app', 'jquery', 'knockout', 'baseViewModel'], function (app, $, ko, base) {
var Page1 = function() {};
Page1.prototype = base;
return Page1;
});
Base 中声明的函数在 Page1 的视图和视图模型中工作得很好,但问题是我需要它们在与 Page1 一起加载的所有模块中工作。这包括:
- 第 1 组 shell 视图(有一个按钮可以激活 Base 内的功能)
- 主 shell 视图(加载栏基于
isLoading
Base 内的 observable 的值可见)
为了让这些工作,我必须定义文件并*.prototype = base;
在每个视图模型中应用相同的文件。
那么有没有更好的方法来处理继承?如果没有,有没有办法只声明一次基础并将其应用于所有子页面?
谢谢!