EXTJS 6 MVVM 基础知识混淆

标签 extjs mvvm extjs6

我是 EXTJS 6 和 MVVM 的新手,我不确定我是否理解正确。请帮助我这个基本示例以及这是否是在 MVVM 架构中做事的正确方法

我首先通过 sencha cmd 创建示例应用程序。我看到它在/view/main/MainModel.js 中创建了一个“变量”?命名为 loremIpsum。我在主视图中看到有一些与 loremIpsum 的绑定(bind)。

我想我的问题是,如果我想创建第二个 View ,比如主视图中的弹出窗口,我如何从 Main 的 viewModel 访问 loremIpsum?

我很困惑我是否应该“共享” Main 的 viewModel,或者我是否应该将 loremIpsum 移动到 model/Base.js,我猜这将是一个共享模型,然后我可以让多个 viewModel 查看那个 View ?

最佳答案

什么是 MVVM?

Model-View-ViewModel (MVVM) 是另一种主要基于 MVC 模式的软件编写架构模式。 MVC 和 MVVM 之间的主要区别在于 MVVM 具有 View 的抽象(ViewModel),它管理 Model 的数据和 View 的数据表示(即数据绑定(bind))之间的变化——这通常是管理起来很麻烦的事情在传统的 MVC 应用程序中。
MVVM 模式试图利用 MVC(功能职责分离)的架构优势,同时还提供数据绑定(bind)的额外优势。结果是模型和框架执行尽可能多的工作,最大限度地减少(并且在某些情况下消除)直接操作 View 的应用程序逻辑。

MVVM 模式的元素包括:

  • Model描述了应用程序中使用的数据的通用格式,就像在经典 MVC 模式中一样。
  • View向用户表示数据,就像在经典的 MVC 模式中一样。
  • ViewModel是 View 的抽象,它调解 View 和关联模型之间的变化。在 MVC 模式中,这将由专门的 Controller 负责,但在 MVVM 中,ViewModel 直接管理相关 View 使用的数据绑定(bind)和公式。

  • MVVM:示例

    在这个 FIDDLE , 我用 grid 创建了一个演示和 window .我希望这将帮助您理解 MVVM 的概念。

    代码片段
    //Define model
    Ext.define('NJDHV10.model.UserModel', {
        extend: 'Ext.data.Model',
        //Define fields in store
        fields: ['fullname', 'email', 'phone'],
    });
    //Define Store
    Ext.define('NJDHV10.store.UserStore', {
    
        extend: 'Ext.data.Store',
        model: 'NJDHV10.model.UserModel',
        alias: 'store.userstore',
        data: [{
            fullname: 'Chunk P',
            email: 'alias@njdhv10.com',
            phone: 9827623311
        }, {
            fullname: 'Champ M',
            email: 'super@njdhv10.com',
            phone: 9827623312
        }, {
            fullname: 'David W',
            email: 'david@njdhv10.com',
            phone: 9827623313
        }, {
            fullname: 'Marin d',
            email: 'marin@njdhv10.com',
            phone: 9827623314
        }]
    
    });
    //Define ViewModel for user list
    Ext.define('NJDHV10.view.UserListModel', {
    
        extend: 'Ext.app.ViewModel',
    
        alias: 'viewmodel.userlistvm',
    
        stores: {
            userstore: {
                type: 'userstore'
            }
        }
    });
    //Define Controller
    Ext.define('NJDHV10.view.UserController', {
    
        extend: 'Ext.app.ViewController',
    
        alias: 'controller.user',
    
        /**
         * This function will fire on grid item click
         * @param { Ext.selection.RowModel} selModel
         * @param {Ext.data.Model} rec
         */
        onGridItemClick: function (selModel, rec) {
            var form = Ext.ComponentQuery.query('userform')[0];
            if (!form) {
                form = Ext.create('NJDHV10.view.UserForm');
            }
            if (form.isHidden()) {
                form.show();
            }
            form.getViewModel().set('userData', rec)
        }
    
    });
    //Define ViewModel for user form data
    Ext.define('NJDHV10.view.UserFormModel', {
    
        extend: 'Ext.app.ViewModel',
    
        alias: 'viewmodel.userformvm',
    
        data: {
            userData: null
        }
    });
    
    //User form for entry
    Ext.define('NJDHV10.view.UserForm', {
        extend: 'Ext.window.Window',
        closable: true,
        width: 320,
        //Define xtype
        // xtype: 'userform',
        alias: 'widget.userform',
        model: true,
        autoDestroy: true,
        floating: true, // make this panel an absolutely-positioned floating component
        //provide viewmodel to form
        viewModel: {
            type: 'userformvm'
        },
    
        title: 'User Form',
    
        layout: {
            align: 'stretch',
            type: 'vbox'
        },
    
        defaults: {
            xtype: 'textfield',
            margin: 10,
            labelAlign: 'top'
        },
    
        items: [{
            fieldLabel: 'Full Name',
            bind: {
                value: '{userData.fullname}' //bind data using viewmodel in form
            },
            name: 'fullname'
        }, {
            fieldLabel: 'Email',
            bind: {
                value: '{userData.email}' //bind data using viewmodel in form
            },
            name: 'email',
            vType: 'email'
        }, {
            fieldLabel: 'Phone Number',
            bind: {
                value: '{userData.phone}' //bind data using viewmodel in form
            },
            name: 'phone'
        }]
    });
    //Define user grid
    Ext.define('NJDHV10.view.UserGrid', {
        extend: 'Ext.grid.Panel',
        xtype: 'usergrid',
        title: 'User List (Click to any row and see details in window)',
        controller: 'user',
        //provide view model to gridQA8sjZHC
        viewModel: {
            type: 'userlistvm'
        },
        //Bind store to grid
        bind: {
            store: '{userstore}'
        },
        //Add listeners into item click
        listeners: {
            itemclick: 'onGridItemClick'
        },
        columns: [{
            xtype: 'rownumberer'
        }, {
            text: 'Name',
            flex: 1,
            dataIndex: 'fullname'
        }, {
            text: 'Email',
            dataIndex: 'email',
            flex: 1
        }, {
            text: 'Phone Number',
            flex: 1,
            dataIndex: 'phone'
        }]
    });
    
    Ext.application({
        name: 'NJDHV10',
        launch: function () {
            //Create grid to view
            Ext.create('NJDHV10.view.UserGrid', {
                layout: 'fit',
                renderTo: Ext.getBody()
            });
        }
    });
    

    关于EXTJS 6 MVVM 基础知识混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48650148/

    相关文章:

    javascript - 如何在extjs6中发送Ajax到远程服务器?

    javascript - Extjs 6 : Adding modal window doesn't mask tbar and header

    javascript - 如何将字段添加到现有面板中?

    html - 如何在 100% 高度的 HTML 正文上设置 Grid ExtJS

    mvvm - Xamarin形式CarouselView不显示图像

    entity-framework - 带有 EF DbContext 延迟加载的 MVVM 主/详细 View - 多个 ViewModel,或全部在一个 VM 中

    javascript - 如何在某些面板中使用特定的 extjs 存储相同的数据?

    javascript - 使用后端的值在 extjs 中动态设置日期

    javascript - 如何默认选择TinyMCE中的 "Justify text"切换按钮?

    ios - 保留循环 Swift 闭包