javascript - KnockoutJS - 基本模型架构

标签 javascript mvvm web knockout.js architecture

我有一个 Web 项目,我需要在其中对一些基本的 JavaScript 类建模并将它们放入单独的 JavaScript 文件中。现在我想在页面上本地使用它们并将它们添加到充当绑定(bind)对象的主视图模型中。我的问题是,你如何实现模型类和主视图模型之间的联系?

这是来自 api 的类模型:

Namespace.Problem = function()
{
    var self = this;

    self.identifier = ko.observable();
    self.summary = ko.observable();
    self.title = ko.observable();
};

Namespace.Problem.withJson = function(json)
{
    var problem = new Namespace.Problem();

    problem.identifier(json.identifier);
    problem.summary(json.summary);
    problem.title(json.title);

    return problem;
};

这里是主视图模型:

function MasterViewModel()
{
    var self = this;

    self.problem = ko.observable({});

    self.loadData = function()
    {
        // Load data via jQuery.getJson();
        self.problem(Namespace.Problem.withJson(json));
    }
}

我在此处的代码中保留了 applyBindings 函数。

在主视图模型中有一个属性是正确的方法吗,看起来像 上面这个,还是应该像

self.problem = new Namespace.Problem();

api 类的模型属性设置是否也正确? 还是下面的更好?

self.identifier;
self.summary;
self.title

最佳答案

首先看一下:

通常是 MainViewModel aggregates subview 模型并通过可观察绑定(bind)将一个 View 模型更改为另一个 View 模型。

文档就绪事件上应用绑定(bind)是最简单和方便的方法

例如:

viewModelFactory = function() {
    function MainViewModel(){
        var self = this;

        self.items = ko.observableArray([
            new Page1(),
            new Page2()
        ]);
        self.selectedPage = ko.observable(self.items()[0]);
        self.onSelected = function(page){
            self.selectedPage(page);       
        };
    }

    function PageViewModel(templateName, linkName){
        var self = this;
        self.templateName = templateName;
        self.linkName = linkName;
    }

    function Page1(){
        var self = this;
        $.extend(self, new PageViewModel('template1', 'Page1'));        
        self.data = 'blablabla-blablabla';
    }

    function Page2(){
        var self = this;
        $.extend(self, new PageViewModel('template2', 'Page2'));

        self.people = [
            { name: 'Paul', age: 18, gender: 'male' },
            { name: 'John', age: 25, gender: 'male' },
        ];
    }

    return {
        create: function(){
            return new MainViewModel();
        }
    };
}();

$(function(){
    var mainViewModel = viewModelFactory.create();
    ko.applyBindings(mainViewModel);
})

这是完整的 sample

关于javascript - KnockoutJS - 基本模型架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23629652/

相关文章:

javascript - 尝试通过 html 显示显示器的宽高比

javascript - 从 HTML 表单中删除元素?

javascript - 按钮在 jQuery 中不起作用

c# - 绑定(bind)按钮功能

javascript - 检测 WordPress 中的浏览器下载错误

php - 如何在 png/jpg 扩展中运行 php 脚本

javascript - 括号中缺少 )

javascript - Dojo DataGrid 如何通知 View 服务器上的数据已更改?

c# - 为异步 UI 消耗包装慢速同步 I/O

c# - MVVM 使用 INotifyPropertyChanged Model 不通知 ViewModel