Заполняем поле менеджер(пользователь системы), заполняем поле даты/время, при заполнении этого поля нужно проверить свободен ли в это время(и следующих 15 мин) менеджер, если да то делаем кнопку доступной.
Интересует как сделать саму проверку.
Нравится
Добрый вечер, Виталий.
Для решения Вашей задачи необходимо:
1) Привязать доступность кнопки к булевому атрибуту, имеющему по умолчанию значение false.
2) При каждом изменении поля Дата/Время делать запрос к базе данных проверяя свободен ли он и на основании результат менять значение атрибута из пункта 1.
Вот что получилось:
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "Activity"});
esq.addAggregationSchemaColumn("Id", Terrasoft.AggregationType.COUNT, "Id");
esq.filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL,
"Owner",
this.get("Owner").value
));
esq.filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.Greater,
"StartDate",
new Date()
));
esq.getEntityCollection(
function(response) {
var e = response.collection.getByIndex(0).get("Id");
e = e + e;
},
this
);
на строке var e = response.collection.getByIndex(0).get("Id"); выбивает ошибку - елемент не найден, если убрать фильтр по дате - выбирает все как есть, значит проблема в фильтре, что я сделал не так? возможно формат другой? я не смог найти пример с датами
так, наткнулся на другую проблему, как я понял оно работает:
формируем запрос и отправили его на сервер и когда придет ответ - обрабатываем его, но не ждем пока он придет код выполняется дальше. когда приходит ответ - выполняется функция "getEntityCollection( function(response". И тут 2 вопроса можно ли сделать так чтоб все висло и ждало пока придет ответ и как передать в эту функцию параметры
Виталий, javascript асинхронный по умолчанию и с этим ничего сделать нельзя.
По поводу параметров:
1) В метод getEntityCollection вторым параметром передается scope выполнения функции обратного вызова. Т.е. если в него передать this - функция сможет работать с любыми атрибутами или методами карточки.
2) Аналогично можно перед вызовом getEntityCollection закешировать this.
var scope = this;
Тогда можно будет получить или изменить любой атрибут обращаясь к scope внутри функции обратного вызова.
var param = scope.get("Owner");
scope.set("Owner", {id: "", displayValue: "Supervisor"})
да но что делать когда нужно выполнить вот такой код:
[javascript]
esq.getEntityCollection(
function(response) {
var ActivitytCount = response.collection.getByIndex(0).get("Id");
if (ActivitytCount === 0) {
this.callParent([function() {
this.Terrasoft.chain(this.publishOnSaveEvents, function() {
this.onSaved(callback, scope);
}, this);
}, this]);
[/javascript]
выбивает ошибку:
TypeError: e is undefined
Как вариант зависания - используйте метод showBodyMask() перед вызовом getEntityCollection. Это позволит отобразить на карточке маску загрузки которая не позволит менять данные.
В функции обратного вызова скройте маску this.hideBodyMask()
[javascript]
this.showBodyMask();
esq.getEntityCollection(function(response) {
//вычисления
this.hideBodyMask()
}, this);
[/javascript]
рекомендую также смотреть в сторону использования try catch что бы избежать вечной маски загрузки если в коллбэке возникнет ошибка
Ошибка в том, что вызвать callParent в функции обратного вызова невозможно, контекст уже утерян.
Пример решения (метод onEntityInitialized взят для примера):
[javascript]
onEntityInitialized: function() {
if(this.get("test") === true){
this.set("test", false);
this.callParent([function() {
this.Terrasoft.chain(this.publishOnSaveEvents, function() {
this.onSaved(callback, scope);
}, this);
}, this]
return;
}
esq.getEntityCollection(
function(response) {
var ActivitytCount = response.collection.getByIndex(0).get("Id");
if (ActivitytCount === 0) {
this.set("test", true)
this.onEntityInitialized();
}
},
this);
}
[/javascript]
Вау! Никогда не использовал такую логику!!! Сработало, благодарю!