Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.05.2016, 20:48
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Ext.app.bind.Formula: Сложные формулы
Я сделал кнопку:

text: "Rollback",
handler: "onRollbackClick",
bind: {
	disabled: "{rollbackButtonDisabled}"
}


И сделал формулу, для расчета свойства disabled этой кнопки:

rollbackButtonDisabled: function(get) {
	var first = get("cuttingListStore").first();
	return !get("started") || (first ? first.get("current") : true);
}


Но она не вычисляется (при загрузке приложения). Я туда подставлял console.log(), который не был вызван.

Что я не так делаю?

П.С. Мало того, при перезагрузке хранилища cuttingListStore как сделать, чтобы disabled пересчитался?

.
__________________
Хусамов Сухроб, Москва, khusamov@yandex.ru
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
Ответить с цитированием
  #2 (permalink)  
Старый 22.05.2016, 21:07
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Вот такая формула, однако, работает:

rollbackButtonDisabled: function(get) {
	console.log("Формула rollbackButtonDisabled")
	return !get("started");
}


В консоли текст появляется "Формула rollbackButtonDisabled".

То есть, сложная формула даже не запускается почему-то...
__________________
Хусамов Сухроб, Москва, khusamov@yandex.ru
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
Ответить с цитированием
  #3 (permalink)  
Старый 22.05.2016, 21:10
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Хе, а вот такая формула уже не пашет:

rollbackButtonDisabled: function(get) {
	/* var first = get("cuttingListStore").first();
	return !get("started") || (first ? first.get("current") : true);*/
	return !get("started");
}


То есть, наличие в ней комментария как-то влияет на ее работу.
__________________
Хусамов Сухроб, Москва, khusamov@yandex.ru
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
Ответить с цитированием
  #4 (permalink)  
Старый 24.05.2016, 02:16
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

Сообщение от khusamov Посмотреть сообщение
Хе, а вот такая формула уже не пашет:

rollbackButtonDisabled: function(get) {
	/* var first = get("cuttingListStore").first();
	return !get("started") || (first ? first.get("current") : true);*/
	return !get("started");
}


То есть, наличие в ней комментария как-то влияет на ее работу.
Я в ViewModels и формулах не силён, но по-косой проглядев исходник Ext.app.bind.Formula увидел там вот такой метод:

parseFormula: function (formula) {
        var str = formula.toString(),
            expressions = {
                $literal: true
            },
            match, getterProp, formulaRe, expr;

        match = this.argumentNamesRe.exec(str);
        getterProp = match ? match[1] : 'get';
        formulaRe = Ext.app.bind.Formula.getFormulaParser(getterProp);

        while ((match = formulaRe.exec(str))) {
            expr = match[2];
            expressions[expr] = expr;
        }

        expressions.$literal = true;

        // We store the parse results on the function object because we might reuse the
        // formula function (typically when a ViewModel class is created a 2nd+ time).
        formula.$expressions = expressions;

        return expressions;
    },


То, что я здесь увидел, напоминает очередное бледное подобие левой руки парсера на регулярных выражениях, который вовсе никак не учитывает потенциальное наличие в теле формулы строк с комментариями. И, в сущности, по понятным причинам: любой программист, когда-либо пытавшийся написать парсер C++ отлично знает, насколько гнойным выходит регекс для обрезания комментариев. Учитывая наследственную кастрированность регексов в JavaScript, я бы просто забил.

А вот почему в документации не указано, что в теле формулы нельзя иметь комментарии, так это вопрос, вполне достойный тикета.
Ответить с цитированием
  #5 (permalink)  
Старый 24.05.2016, 10:37
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Но, возвращаясь к началу тему, эта формула тоже не работает:

rollbackButtonDisabled: function(get) {
	var first = get("cuttingListStore").first();
	return !get("started") || (first ? first.get("current") : true);
}


Я тут похоже чего-то не понимаю в этих формулах...
__________________
Хусамов Сухроб, Москва, khusamov@yandex.ru
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
Ответить с цитированием
  #6 (permalink)  
Старый 24.05.2016, 13:23
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

Мне кажется что проблема в отсутствии cuttingListStore на момент вычисления формулы. Предполагаю, это стор из той же вьюмодели? Например он еще не создан, гет возвращает нулл. Нулл не имеет метода first и получаем ошибку. Попробуйте добавить проверку на нулл.
Ответить с цитированием
  #7 (permalink)  
Старый 24.05.2016, 13:25
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Ну и что что он отсутствует? Формула ведь даже не запускается!!! Я туда console.log вставил, он не был выполнен. Хотя если сторе убрать:

rollbackButtonDisabled: function(get) {
	console.log("куку");
	return !get("started");
}


То все в порядке. Куку появится.
__________________
Хусамов Сухроб, Москва, khusamov@yandex.ru
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
Ответить с цитированием
  #8 (permalink)  
Старый 24.05.2016, 13:27
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

В общем у меня есть идея. Создать в сторе свойство firstRow и опубликовать через publishes. И по событию load его переопубликовывать. Думаю тогда все заработает как надо...
__________________
Хусамов Сухроб, Москва, khusamov@yandex.ru
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
Ответить с цитированием
  #9 (permalink)  
Старый 24.05.2016, 16:22
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Нашел решение:

Сделал в модели вида firstCuttingItemIsCurrent, которую обновляю по событию load хранилища и следующая формула заработала.

rollbackButtonDisabled: function(get) {
			return !get("started") || get("firstCuttingItemIsCurrent");
		}
__________________
Хусамов Сухроб, Москва, khusamov@yandex.ru
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сложные проекты BeeJee123 Работа 1 28.10.2015 11:44
как реализовать вывод формулы подсчета из б/д. YegorSSS Общие вопросы Javascript 12 27.05.2015 19:20
Формулы в текстовом поле levshkatov Общие вопросы Javascript 2 16.09.2014 10:04
Формулы Easing-функций nyols Общие вопросы Javascript 1 25.09.2012 18:24
Формулы в каком виде mycoding Оффтопик 1 01.06.2010 11:59