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 пересчитался? . |
Вот такая формула, однако, работает:
rollbackButtonDisabled: function(get) { console.log("Формула rollbackButtonDisabled") return !get("started"); } В консоли текст появляется "Формула rollbackButtonDisabled". То есть, сложная формула даже не запускается почему-то... |
Хе, а вот такая формула уже не пашет:
rollbackButtonDisabled: function(get) { /* var first = get("cuttingListStore").first(); return !get("started") || (first ? first.get("current") : true);*/ return !get("started"); } То есть, наличие в ней комментария как-то влияет на ее работу. |
Цитата:
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; }, То, что я здесь увидел, напоминает очередное бледное подобие А вот почему в документации не указано, что в теле формулы нельзя иметь комментарии, так это вопрос, вполне достойный тикета. |
Но, возвращаясь к началу тему, эта формула тоже не работает:
rollbackButtonDisabled: function(get) { var first = get("cuttingListStore").first(); return !get("started") || (first ? first.get("current") : true); } Я тут похоже чего-то не понимаю в этих формулах... |
Мне кажется что проблема в отсутствии cuttingListStore на момент вычисления формулы. Предполагаю, это стор из той же вьюмодели? Например он еще не создан, гет возвращает нулл. Нулл не имеет метода first и получаем ошибку. Попробуйте добавить проверку на нулл.
|
Ну и что что он отсутствует? Формула ведь даже не запускается!!! Я туда console.log вставил, он не был выполнен. Хотя если сторе убрать:
rollbackButtonDisabled: function(get) { console.log("куку"); return !get("started"); } То все в порядке. Куку появится. |
В общем у меня есть идея. Создать в сторе свойство firstRow и опубликовать через publishes. И по событию load его переопубликовывать. Думаю тогда все заработает как надо...
|
Нашел решение:
Сделал в модели вида firstCuttingItemIsCurrent, которую обновляю по событию load хранилища и следующая формула заработала. rollbackButtonDisabled: function(get) { return !get("started") || get("firstCuttingItemIsCurrent"); } |
Часовой пояс GMT +3, время: 15:49. |