Странная проблема: Магистральная модель, показывающая другое значение в одном из методов
Я показываю модальное диалоговое окно Bootstrap (UserPermission) по нажатию кнопки, где я показываю jqxTreeGrid, отображающий список пользователей. У каждого пользователя есть свои настройки прав доступа.
Итак, у меня есть следующие ресурсы для настройки модального диалога Bootstrap:
У меня есть модель Backbone с именем UserPermissionModel.js
define (['app', 'underscore', 'backbone'],
function(app, _, Backbone) { "use strict"; var UserPermissionModel = Backbone.Model.extend({ defaults: { userList:[], permissions:[] } }); return UserPermissionModel;
});
У меня есть View UserPermissionView, со следующими методами
initialize: function () { var self = this; self.model = new UserPermissionModel(); }
После рендеринга я вызываю веб-сервис, который предоставляет мне список пользователей, который я сохраняю в массиве userList в модели. Так как это первый раз, когда я устанавливаю разрешения, я установил для массива Permission значения по умолчанию.
afterRender: function () {var self = this;
self.model.set("userList", []); self.model.set("permissions", []); // Get all the users save them in model AllUsers.fetch(function (Users) { Users.each(function (user) { // create the permission object reference var permission = new PermissionInfo(); // set defaults permission.createJSON({ userId: user.attributes.id, read: "", write: "" }); // Save the group in model self.model.get("userList").push(user); // Save the permission in model self.model.get("permissions").push(permission); }); // Show the groups in jqxTreeGrid self.loadListGrid(); }, function (error) { // error handling });
},
Как только я получаю userList, я показываю их на jqxTreeGrid, используя метод loadListGrid.
Внутри готового метода jqxTreeGrid я инициализирую всплывающее окно. Ниже приведен код jqxTreeGrid, который я поместил в метод loadListGrid представления Backbone.
$("#jqxListGrid").jqxTreeGrid({
width: '100%',
source: dataAdapter,
theme: 'iltreegrid',
columnsHeight: 35,
ready: function() {
// initialize the Permission Setting Popover
var popOverSettings = {
placement: 'bottom',
container: 'body',
html: true,
selector: '[rel="popover"]',
content: $('#ad_permissionSettingPopover').html()
}
// bind the popover on body
$("body").popover(popOverSettings).parent().delegate('button.btn_permission_ok', 'click', function () {
//that.setDocumentPermissions();
app.pubSub.trigger("permissionPopover:onOk");
$("[rel=popover]").popover("destroy");
$(".popover").remove();
}).on("show.bs.popover", function (e) {
// hide all other popovers before showing the current popover
$("[rel=popover]").not(e.target).popover("destroy");
$(".popover").remove();
}).on("shown.bs.popover", function (e) {
// set the z-index of the popover as it is going behid the jqxTreeGrid Column
$('.popover').css('z-index', '999999');
// add the style class
$('.popover').addClass('jqxtreegridCell-popover');
// get the current value of permission settings and
// mark the radio button checked
app.pubSub.trigger("permissionPopover:onShow");
});
// click on cancel button removes the popover
$("body").popover(popOverSettings).parent().delegate('div.btn_permission_cancel', 'click', function () {
$("[rel=popover]").popover("destroy");
$(".popover").remove();
});
},
columns: [
{
text: '<span class="ilicon ilicon-user"></span>' + app.i18n.t("doc_permission_userName", " User Name"),
datafield: 'userName',
cellsrenderer: userIconRenderer,
width:'40%'
},
{
text: '',
datafield: 'id',
width: '0%',
hidden: true
},
{
text: '<span>' + app.i18n.t("doc_permission_userType", "User Type") + '</span>',
datafield: 'userType',
width: '18%'
},
{
text: '<span>' + app.i18n.t("doc_permission_email", "Email") + '</span>',
datafield: 'userEmail',
width: '18%'
},
{
text: '<span>' + app.i18n.t("doc_permission_permissionSetting", "Permission Setting") + '</span>',
width: '24%',
cellsrenderer: permissionSettingRenderer,
sortable: false
}
]
});
У каждого пользователя в сетке есть кнопка, которая показывает поповер с некоторыми переключателями. Разрешение по умолчанию проверяется для этого пользователя (который я прочитал из массива разрешений, хранящегося в модели). Я могу выбрать другое разрешение для этого пользователя и обновить массив разрешений в модели для этого конкретного пользователя.
Надеюсь, я смог объяснить функциональность.
Теперь, когда я открываю модальное в первый раз. Все работает отлично. Но когда я закрываю модальное окно и открываю его снова, именно здесь возникает проблема. Когда я читаю permissins в методе "seen.bs.popover", у Backbone Model есть значения в массиве Permission, которые я никогда не устанавливал. Это дает мне неправильные значения. Но в любом другом методе он имеет правильное значение
Я старался изо всех сил повторить сценарий здесь. Если у кого-то есть идеи, пожалуйста, прокомментируйте.
Спасибо Ямин