I’m a new user to knockout.js and so far have been very impressed with basic use.
I want to be able to auto calculate a field (yr2 Expense) based on a previous field (yr1 Expense), but also allow the user to change the auto calculated field. This auto calculated field is then used for another calculation (Total Yr2). I’ve been trying to do so with this jsfiddle, but have had no luck so far. I can’t find any info in the examples on how to do this.
I first tried making yr2 Expense an observable, which does not allow for auto calculation. I then tried making yr2 Expense a computed, which does not allow for Total Yr2 to be updated with user input. Is what I’m trying to do not possible? I would think this would be common in finance calculation forms, which is what I’m doing this for.
First of all, variable names should be easy to understand and intention revealing. There is no benefit to obtuse or abbreviated names, like the ones used in your fiddle. They are confusing, and this adds difficulty to code maintenance. If you plan to minify your js later then the names wont matter anyway. If you need to read your code later, having full, easy to understand names helps tremendously.
There are two ways to accomplish what you are after.
One method would be to use subscribers to alter the calculation of the observable after a change. See this, near the bottom of the page. Here is a fiddle demonstrating this method. For this example, I recommend this method.
Note: I am leaving off
valueUpdateso that recalculations only occur when the user is done typing. If you use afterkeydown, it will recalc early, causing issues. Try pressing[Enter]when you want it to recalc.The second method is to use writable observables (Second header, 1/3 down the page) to make
computed observablesthat have read and write methods. I don’t think this method is as good a fit for this specific example, but the example in the linked KO documentation should give you an idea of when it works well.