我是 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 模式的元素包括:
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/