【问题标题】:EXTJS 6 MVVM basics confusionEXTJS 6 MVVM 基础知识混淆
【发布时间】:2018-02-06 19:03:15
【问题描述】:

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

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

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

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

【问题讨论】:

  • 另外,如果有人有一个很好的基本示例,有 2 个视图和一个共享的模型视图/模型,可能对我有帮助,我将不胜感激,谢谢

标签: extjs mvvm extjs6


【解决方案1】:

什么是 MVVM?

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

MVVM 模式的元素包括:

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

MVVM:一个例子

在这个FIDDLE中,我使用gridwindow 创建了一个演示。我希望这能帮助您理解 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()
        });
    }
});

【讨论】:

  • 感谢您的反馈。我想我现在对视图和视图模型的工作方式有了更清楚的了解,但我现在有一个更具体的问题,我将在新帖子中提出这个问题,之后我将在此处链接
  • 这是我创建的新帖子,其中包含一个更具体的问题示例stackoverflow.com/questions/48666522/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 2018-05-25
  • 2014-11-28
  • 2014-02-14
相关资源
最近更新 更多