javascript - 拆分 knockoutjs

标签 javascript knockout.js

我的应用 View 模型变得非常大。如何正确地将其拆分为文件和命名空间?我是否创建第二个命名空间对象并将 View 模型作为参数传入?

var BALL = {};
BALL.roll = function(avm) { // function code };

最佳答案

我个人的偏好是不拆分我的 applyBindings 调用,而是使用一个全局命名空间分支。

我的理由是,要使多个绑定(bind)正确工作而不发生冲突,您需要非常小心,不要更改所选的目标 dom 元素。不幸的是,标记有一个随时间变化的坏习惯,这会让您以后在使用 viewModel 时遇到麻烦。

我在一个非常大的 KO 项目中使用的一般方法是

  1. 整个应用程序的一个全局顶级命名空间,例如 myapp
  2. 将单独的功能 block 拆分成单独的文件。通常有自己独特的命名空间。例如`myapp.navigation'
  3. 如果某个命名空间特别大,则将其拆分为更多的子命名空间,或者如果这样做不合适,则将同一命名空间拆分为多个文件。
  4. 最后混合所有文件以保持性能。

我最近使用的一些命名空间代码

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/

相关文章:

jquery - 覆盖 ko.compute 值

javascript - Knockout JS 模板 attr href 绑定(bind)返回函数而不是值

javascript - 使函数接受可变数量的参数或数组中的值

typescript - 在浏览器中使用 TypeScript 和 ES2015 的 KnockoutJS

javascript - 如何调用 php 函数以使用 jQuery 从 MYSQL 获取更新的数据

javascript - Fetch API 中的请求信号属性

javascript - 使用 knockout js 网站教程 - 如何将全名大写(而不仅仅是姓氏)?

javascript - 为什么从上下文菜单中复制停止工作?

javascript - 检测用户输入是否包含 JavaScript 中的禁用字符

javascript - 尽管没有错误,但我的 react 组件没有显示