ExtJS 4-重用MVC架构中的组件

如何解决ExtJS 4-重用MVC架构中的组件

| 我有一个用户列表,如果单击此列表中的一个项目,则会打开一个窗口。每个用户都使用同一窗口,并且可以同时打开多个窗口。该窗口显示用户信息,因此对于这些组件,我具有相同的商店和相同的型号。 但是,如果我在特定窗口中加载数据,则在所有其他打开的窗口中加载相同的数据。
Ext.define(\'Cc.view.absence.Grid\',{
  extend: \'Ext.grid.Panel\',alias: \'widget.absencegrid\',border:false,initComponent: function() {
    Ext.apply(this,{
      store: Ext.create(\'Ext.data.Store\',{
        model: \'Cc.model.Absence\',autoLoad: false,proxy: {
          type: \'ajax\',reader: {
            type: \'json\'
          }
        }
      }),columns: [
        {header: \'Du\',dataIndex: \'startdate\',flex: 3,renderer: this.formatDate},{header: \'Au\',dataIndex: \'enddate\',{header: \'Exercice\',dataIndex: \'year\',align: \'center\',flex: 1},{header: \'Statut\',xtype:\'templatecolumn\',tpl:\'<img src=\"../images/status-{statusid}.png\" alt=\"{status}\" title=\"{status}\" />\',{header: \'Type d\\\'absence\',dataIndex: \'absencetype\',flex: 2},{header: \'Commentaires\',dataIndex: \'comment\',flex: 6}
      ],dockedItems: [{
        xtype: \'toolbar\',dock: \'top\',items: [
          { xtype: \'tbfill\'},{ xtype: \'button\',text: \'Rafraichir\',action: \'refresh\',iconCls: \'item-rafraichir\' }
        ]
      }]
    });

    this.callParent(arguments);
  },formatDate: function(date) {
    if (!date) {
      return \'\';
    }
    return Ext.Date.format(date,\'l d F Y - H:i\');
  }

});
我的控制器:
Ext.define(\'Cc.controller.Absences\',{
  extend: \'Ext.app.Controller\',models: [\'Absence\',\'AbsenceHistory\'],views: [],refs: [
    { ref: \'navigation\',selector: \'navigation\' },{ ref: \'tabPanel\',selector: \'tabpanel\' },{ ref: \'absencePanel\',selector: \'absencepanel\' },{ ref: \'refreshButton\',selector: \'absencepanel button[action=refresh]\'},{ ref: \'absenceGrid\',selector: \'absencegrid\' },{ ref: \'absenceHistory\',selector: \'absencehistory\' },],init: function() {
    this.control({
      \'absencepanel button[action=refresh]\': {
        click: this.onClickRefreshButton
      },\'absencegrid\': {
        selectionchange: this.viewHistory
      },\'absencegrid > tableview\': {
        refresh: this.selectAbsence
      },});
  },selectAbsence: function(view) {
    var first = this.getAbsenceGrid().getStore().getAt(0);
    if (first) {
      view.getSelectionModel().select(first);
    }
  },viewHistory: function(grid,absences) {
    var absence = absences[0],store = this.getAbsenceHistory().getGrid().getStore();
    if(absence.get(\'id\')){
      store.getProxy().url = \'/absence/\' + absence.get(\'id\') +\'/history\';
      store.load();
    }
  },onClickRefreshButton: function(view,record,item,index,e){
    var store = this.getAbsenceGrid().getStore();
    store.load();
  },});
其他控制器,仅创建一个不存在的实例。Panel:
Ext.define(\'Cc.controller.Tools\',stores: [\'Tools\',\'User\' ],models: [\'Tool\'],{ ref: \'toolList\',selector: \'toollist\' },{ ref: \'toolData\',selector: \'toollist dataview\' }
  ],init: function() {
    this.control({
      \'toollist dataview\': {
        itemclick: this.loadTab
      },onLaunch: function() {
    var dataview = this.getToolData(),store = this.getToolsStore();

    dataview.bindStore(store);
  },loadTab: function(view,e){
    var tabPanel = this.getTabPanel();
    switch (record.get(\'tab\')) {
      case \'absences\':
        if(Ext.getCmp(\'absence-panel\')){
          tabPanel.setActiveTab(Ext.getCmp(\'absence-panel\'));
        }
        else {
          var panel = Ext.create(\'Cc.view.absence.Panel\',{
            id: \'absence-panel\'
          }),store = panel.getGrid().getStore();
          panel.enable();
          tabPanel.add(panel);
          tabPanel.setActiveTab(panel);
          store.getProxy().url = \'/person/\' + this.getUserId() +\'/absences\';
          store.load();
        }
      break;

      default: 
      break;
    }
  },getUserId: function(){
    var userStore = this.getUserStore();
    var id = userStore.first().get(\'id\')
    return id;
  }
});
另一个控制器,它创建许多不存在的实例。
Ext.define(\'Cc.controller.Agents\',stores: [\'Agents\'],models: [\'Agent\',\'Absence\',views: [\'agent.List\',\'agent.Window\',\'absence.Panel\',\'absence.Grid\',\'absence.History\'],refs: [
    { ref: \'agentList\',selector: \'agentlist\' },{ ref: \'agentData\',selector: \'agentlist dataview\' },{ ref: \'agentWindow\',selector: \'agentwindow\' },init: function() {
    this.control({
      \'agentlist dataview\':{
        itemclick: this.loadWindow
      },onLaunch: function() {
    var dataview = this.getAgentData(),store = this.getAgentsStore();
    dataview.bindStore(store);
  },loadWindow: function(view,e){
    if(!Ext.getCmp(\'agent-window\'+record.get(\'id\'))){
      var window = Ext.create(\'Cc.view.agent.Window\',{
        title: \'À propos de \'+record.get(\'firstname\')+\' \'+record.get(\'lastname\'),id: \'agent-window\'+record.get(\'id\')
      }),tabPanel = window.getTabPanel();
          absencePanel = window.getAbsencePanel();
          store = absencePanel.getGrid().getStore();

      absencePanel.enable();
      tabPanel.add(absencePanel);
      tabPanel.setActiveTab(absencePanel);
      store.getProxy().url = \'/person/\' + record.get(\'id\') +\'/absences\';
      store.load();
    }
    Ext.getCmp(\'agent-window\'+record.get(\'id\')).show();
  }
});
和missing.Panel视图,missing.Grid的容器:
Ext.define(\'Cc.view.absence.Panel\',{
    extend: \'Ext.panel.Panel\',alias: \'widget.absencepanel\',title: \'Mes absences\',iconCls: \'item-outils\',closable: true,border: false,disabled: true,layout: \'border\',initComponent: function() {
    this.grid = Ext.create(\'Cc.view.absence.Grid\',{
      region: \'center\'
    });
    this.history = Ext.create(\'Cc.view.absence.History\',{
      region: \'south\',height: \'25%\'
    });
        Ext.apply(this,{
      items: [
        this.grid,this.history
      ]
    });

        this.callParent(arguments);
    },getGrid: function(){
    return this.grid;
  },getHistory: function(){
    return this.history;
  }
});
    

解决方法

是。这是我正在做什么的更多详细说明。希望您已经阅读了完整的论坛。仍然有一个我们不清楚的信息。那就是在控制器中使用\“ stores \”属性的确切用法。恕我直言,Sencha团队应使用复杂的示例对MVC进行更详细的说明。 是的,您新发布的内容是正确的。创建新视图后,请创建商店的新实例!现在,从论坛讨论中,人们开始争论MVC。我一定会和斯蒂芬克一起去。我在这里所做的就是将新的store实例注入我的视图。而且我忽略了控制器的5属性。 这是一个例子: 这是我的看法。我在选项卡面板上显示的面板(包含用户个人资料信息):
Ext.define(\'Dir.view.profile.View\',{
    extend: \'Ext.panel.Panel\',alias : \'widget.profileview\',title : \'Profile\',profileId: 1,// default and dummy value
    initComponent: function() {

        // configure necessary stuff,I access my store etc here..       
        // console.log(this.profileStore);
        this.callParent(arguments);         
    },// Other view methods goes here
});
现在,看一下我的控制器:
Ext.define(\'Dir.controller.Profile\',{
    extend: \'Ext.app.Controller\',//stores: [\'Profile\'],--> Note that I am NOT using this!
    refs: [     
        {ref:\'cp\',selector: \'centerpane\'}
    ],views: [\'profile.View\'],init: function() {
        // Do your init tasks if required
    },displayProfile: function(selectedId) {

            // create a new store.. pass your config,proxy url etc..
        var store = Ext.create(\'Dir.store.Profile\',{profileId: selectedId});

        console.log(\'Display Profile for ID \' + selectedId);    

        // Create instance of my view and pass the new store
        var view = Ext.widget(\'profileview\',{profileId: selectedId,profileStore: store});

        // Add my new view to centeral panel and display it...
        this.getCp().add(view);
        this.getCp().setActiveTab(view);
    }
});
我的
displayProfile()
是从某些事件侦听器(菜单,树等)中调用的,并传递一个ID。我的控制器使用此ID来设置新的商店和视图。我希望上面的代码能使您清楚地了解我昨天所说的内容。 在您的控制器中,您将必须添加“ 9”,以便ExtJS知道您拥有这样的商店。这是因为我们没有使用
stores
属性。 现在,您可以在其他地方重用这些创建的商店,可以将它们添加到StoreManager。这样,您可以在任何地方访问创建的商店,添加和删除商店。但这会带来管理存储实例的开销。 为什么要共享具有不同视图的商店的同一实例?当您有新视图时,请创建商店的新实例。这样一来,刷新后的其他窗口将不会显示更新的数据。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-