我的应用 View 模型变得非常大。如何正确地将其拆分为文件和命名空间?我是否创建第二个命名空间对象并将 View 模型作为参数传入?
var BALL = {};
BALL.roll = function(avm) { // function code };
最佳答案
我个人的偏好是不拆分我的 applyBindings
调用,而是使用一个全局命名空间分支。
我的理由是,要使多个绑定(bind)正确工作而不发生冲突,您需要非常小心,不要更改所选的目标 dom 元素。不幸的是,标记有一个随时间变化的坏习惯,这会让您以后在使用 viewModel 时遇到麻烦。
我在一个非常大的 KO 项目中使用的一般方法是
- 整个应用程序的一个全局顶级命名空间,例如
myapp
- 将单独的功能 block 拆分成单独的文件。通常有自己独特的命名空间。例如`myapp.navigation'
- 如果某个命名空间特别大,则将其拆分为更多的子命名空间,或者如果这样做不合适,则将同一命名空间拆分为多个文件。
- 最后混合所有文件以保持性能。
我最近使用的一些命名空间代码
var Namespace = (function() {
var namespace, global, root;
namespace = function(identifier, contents) {
if (!identifier || identifier.length == 0) {
throw Error("A namespace identifier must be supplied");
}
global = window;
// create the namespace
var parts = identifier.split(".");
for (var i = 0; i < parts.length; i += 1) {
if (!global[parts[i]]) {
global[parts[i]] = {};
}
if (i == 0) {
root = global[parts[i]];
}
global = global[parts[i]];
}
// assign contents and bind
if (contents) {
global.$root = root;
contents.call(global);
}
};
return namespace;
})();
所以在你的 myapp.navigation 文件中你会有
Namespace("myapp.navigation", function() {
var self = this; // your myapp.navigation object
this.someFunction = function() {
}
});
这只是使用自调用函数传入手动构造的命名空间的简写。它为您提供了一个私有(private)闭包,您可以在不同的 js 文件中自由使用具有相同命名空间的多个命名空间调用。
您的 applyBindings 调用现在可以始终是
ko.applyBindings(myapp);
希望这对您有所帮助。
关于javascript - 拆分 knockoutjs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9210249/