【问题标题】:Binding viewModel property with variable将 viewModel 属性与变量绑定
【发布时间】:2017-11-07 14:55:51
【问题描述】:

简介: 我需要调用后端控制器来查看用户是否是管理员。如果用户是管理员,则隐藏应用程序中的工具栏。目前 var 正在成功更改;但是,在创建视图后它会发生变化,导致视图始终使工具栏可见。

问题:

  • 需要检查后端以查看用户是否在管理员组中。
  • 如果他们在管理员组中,需要返回 true

我的代码:

var adminBool = false;

function CheckAdmin() {
    debugger;
    var a;
    Direct.Report.IsAdmin(this.results, a);
    debugger;
};

function results(result, constructor, c, d, e, f, g, h) {
    debugger;
    this.adminBool= result.adminUser; //returns bool
}

Ext.define('Ext.View.MyViewModel', {
    extend: 'Ext.app.ViewModel',

    alias: 'viewmodel.AdministrationViewModel',
    init: this.CheckAdmin(),
    data: {
        addNew: true,
        update: true,
        gridData: null,
        isAdmin: this.adminBool
    }
});

简介:

  1. 调用后台控制器获取管理员状态

  2. 返回布尔值

  3. 分别用 bool 更新 viewModel

  4. ViewModel 属性“isAdmin”将与隐藏属性绑定以隐藏非管理员不需要的操作

更新:

基本上我需要一种方法来延迟“isAdmin:this.adminBool”检查到后端调用完成后。

【问题讨论】:

  • 有人知道解决办法吗?
  • 不是最好的解决方案,但为什么不从隐藏unwanted actions 组件开始呢?同时,您的 ext 直接异步请求将验证登录并将您的 isAdmin 更改为 true(如果是这样),从而显示隐藏的组件。
  • 所以我确实有你提到的这个,但是当 isAdmin 变为 true 时,它​​不会改变更新程序以取消隐藏工具栏。
  • 如果不是管理员,您是否在要隐藏的组件中设置了bind: { hidden: '{!isAdmin}' }
  • 是的,我做了,绑定:{ hidden: '!{isAdmin}' },

标签: javascript extjs viewmodel


【解决方案1】:

当你使用ViewModel

所以你可以使用set() 方法来更新你的viewmodel 字段。

我使用viewmodel 创建了一个sencha fiddle 演示。您可以检查它在小提琴中的工作方式。在这个小提琴中,我没有使用任何 API,它只是关于 ViewModel 的示例。希望这能帮助您解决问题或实现您的要求。

//ViewModel
Ext.define('MyViewModel', {
    extend: 'Ext.app.ViewModel',
    alias: 'viewmodel.AdministrationViewModel',
    data: {
        isAdmin: true
    }
});
//Panel
Ext.create('Ext.panel.Panel', {
    title: 'ViewModel example',
    width: '100%',
    renderTo: Ext.getBody(),
    viewModel: 'AdministrationViewModel',
    layout: {
        type: 'vbox', // Arrange child items vertically
        align: 'stretch', // Each takes up full width
        padding: 10
    },
    defaults: {
        margin: 10
    },
    items: [{
        xtype: 'combo',
        height: 40,
        fieldLabel: 'Choose Admin or user',
        emptyText: 'Choose Admin or user',
        labelAlign: 'top',
        store: {
            fields: ['name', 'value'],
            data: [{
                "value": true,
                "name": "Admin"
            }, {
                "value": false,
                "name": "User"
            }]
        },
        queryMode: 'local',
        displayField: 'name',
        valueField: 'value',
        listeners: {
            select: function (combo, record) {
                var viewModel = combo.up('panel').getViewModel(),
                    isAdmin = record.get('value');

                //If selected value is {Admin} then we will show toolbar otherwise in case of {User} hide
                viewModel.set('isAdmin', !isAdmin);
            }
        }
    }, {
        xtype: 'toolbar',
        width: '100%',
        height: 50,
        padding: 10,
        bind: {
            hidden: '{isAdmin}'
        },
        items: [{
                // xtype: 'button', // default for Toolbars
                text: 'Admin',
            }, {
                xtype: 'splitbutton',
                text: 'Split Button'
            },
            // begin using the right-justified button container
            '->', // same as { xtype: 'tbfill' }
            {
                xtype: 'textfield',
                name: 'field1',
                emptyText: 'enter search term'
            },
            // add a vertical separator bar between toolbar items
            '-', // same as {xtype: 'tbseparator'} to create Ext.toolbar.Separator
            'text 1', // same as {xtype: 'tbtext', text: 'text1'} to create Ext.toolbar.TextItem
            {
                xtype: 'tbspacer'
            }, // same as ' ' to create Ext.toolbar.Spacer
            'text 2', {
                xtype: 'tbspacer',
                width: 50
            }, // add a 50px space
            'text 3'
        ]
    }]
});

【讨论】:

  • 非常感谢您花时间做这件事。我正在努力解决的问题是在后端验证管理员权限。我有一个对后端的函数调用来检查用户是否是管理员,但是我确定如何使变量存储该函数返回。我的代码可以正常工作以使用函数返回来存储变量,但是在 viewModel 中 - “isAdmin:this.adminBool”在后端调用返回值之前检查变量。我只需要一种方法来延迟检查“isAdmin: this.adminBool”。
  • 所以在这种情况下,您可以在获得response of ajaxbackend 之后执行您的功能。
  • 响应后强制功能是我的问题。目前它在视图呈现后返回响应。我能想到的唯一方法就是刷新视图,但是,我认为一旦渲染视图就刷新它是相当愚蠢的。
猜你喜欢
  • 1970-01-01
  • 2011-06-22
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多