It's been awhile. I'm doing web development at my new job, so this and future posts may focus on that.
I used Knockout.js recently, and I'll share a few tips that I learned the hard way.
1. Watch the parentheses.
Remember that ko.observable objects are functions. If you're binding to the property and nothing else, you can omit the parentheses. If an expression is involved, you'll generally need them. If in doubt, include them.
The easiest way to avoid the need for parentheses is to put as much logic as possible in the view model. This minimizes expressions in the markup.
2. Be careful mixing server-side and client-side code.
This was on an ASP.NET MVC site, and we had both view engine markup and Knockout bindings originally. This proved difficult to reason about. While it's definitely possible, remember that Knockout is only going to see the page once it's rendered client-side.
3. Avoid comment (containerless) Knockout bindings.
I found that these did not seem to play well with templates, and they may not work with IE8.
4. Don't mix if bindings with other bindings.
I combined an if and a text binding in the same element. This resulted in an error of "You cannot use these bindings together on the same element." One solution is to use another span or div.
5. Don't mix if bindings with CSS classes or other markup.
In general, use if bindings with a div that has no classes, etc. The issue is when the binding is falsy, the element will still render - it'll just be empty. Styles can cause undesired visual artifacts.
6. Be cautious if mixing jQuery and Knockout.
We were using jQuery to wire up form submission to a class that was in a Knockout foreach. It wasn't working. The fix was to switch to a Knockout submit binding. Knockout can work fine with jQuery in most cases, though.
7. Remember what binding context you're in.
Especially with foreach, it's easy to forget and bind to the current item when you meant to bind to $parent or $root. The Knockoutjs context debugger (search the Chrome store) can help.
8. Don't try to do progressive enhancement.
9. Encode where appropriate.
It appears that attr bindings don't encode anything (although the text binding does). This is particularly relevant when binding to the href attribute of an anchor.
10. Use foreach on the parent element.
The documentation is clear on this, but it's easy to misread. The result of binding to a child is typically missing closing tags.
I like Knockout, and the learning curve isn't very steep. Keep it simple and it seems to work well.