Keypress event в Knockout.js

30 янв. 2013 г. | | |

Столкнулась с проблемой в knockout.js: в текстовом нужно было отследить нажание кнопки Enter. Делов-то: привязываем к событию keypress нужный метод, и в нём уже смотрим, какая клавиша была нажата:
//html
<div>
    <input type="text" data-bind="value: someValue, event : { keypress = function(data, event) { handleKeyPress(data, event) } }" />
    <span data-bind="text: someValue"></span>
</div>


//view model
var ViewModel = function() {
    var self = this;
    self.someValue = ko.observable('');

    self.handleKeyPress = function(data, event)
    {
           if (event.keyCode == 13)
           {
               //сделать что-нибудь полезное
           }
    }
}   
ko.applyBindings(new ViewModel()); 

Но не тут-то было! После таких манипуляций текстовое поле перестало реагировать на нажатия всех клавиш, кроме enter. Помогло создание своего специализированного binding-а:
ko.bindingHandlers.enterKey = {
    init: function(element, valueAccessor, allBindings, vm) {
        ko.utils.registerEventHandler(element, "keyup", function(event) {
            if (event.keyCode === 13) {
                ko.utils.triggerEvent(element, "change");

//set "this" to the data and also pass it as first arg, in case function has "this" bound
                 valueAccessor().call(vm, vm);
            }
          
            return true;
        });
    }        
}; 

В html это отразится привязыванием на созданный байндинг нужного метода:
<div>
    <input type="text" data-bind="value: someValue, enterKey: doSomething } }" />
    <span data-bind="text: someValue"></span>
</div>

Спасибо stackoverflow

Плохой программист

26 янв. 2013 г. | | |

Наверное, многим знакома ситуация, когда, взглянув на чей-то код, думаешь "$%#... как можно так писать?!" Тут даже рефакторить бесполезно! Выкинуть бы да переписать с нуля! А бывало ли так, что вы сами оказывались по ту сторону баррикад? Что кто-то смотрел на ваш код, и в глазах ревизора читался ужас :)?
А как вы сами относитесь к коду, написанному вами же, полгода, год, два года назад? Кажется ли применённый подход и найденное решение таким же правильным? Или как-то так?

Лично я считаю такую реакцию вполне нормальной и, даже, правильной.
Полгода (не говоря уже о том, что целый год), - это большой отрезок времени. Это целых 182 дня = 4368 часа, из которых 2912 часа человек бодрствует (при расчете, что на сон уходит 8 часов). Достаточно ли 2912 часов, чтобы узнать хоть что-нибудь новое и полезное для себя?

За полгода могут измениться взгляды на всё, ведь даже новое хобби или прочитанная книга (статья)  - это способ открыть для себя что-то новое. Знакомство с новой технологией или изучение другого языка программирования - это способ научиться мыслить иначе. Хотя...
Программист на Фортране может написать программу на Фортране на любом языке программирования.
Ed Post, 1983
Поэтому осознание того, насколько вы плохой программист, - это явный признак того, что как профессионал вы сделали шаг вперёд, стали лучше.
It is possible that you are a bad programmer. You'll never know until someone better sees it.
(c) Scott Hanselman
И пусть этим someone better будете вы сами :)

Компиляция CoffeeScript в JavaScript используя Sublime Text 2

4 янв. 2013 г. | | |

CoffeeScript - рафинированный JavaScript, который хочется писать ещё и ещё. Цель этой заметки рассмотреть, как писать и компилировать код на CoffeeScript в js, используя Sublime Text 2.
Весь процес можно разбить на два этапа:
1. Подготовительный этап - установка компилятора CoffeeScript
2. Установка плагина CoffeeScript под Sublime Text 2
И так, приступим.