The the view model is an observable, Knockout must re-parse all bindings when that observable changes. That's because bindings are parsed relative to the (unwrapped) value held by the observable. In your example,
$data refers to the actual array held by the observableArray. When using
push, the array instance remains the same, and so
getBindingAccessors doesn't
need to be called again. But Knockout can't assume anything like that. Suppose that instead of using
push, you had replaced the array instance, like
arr(["test"]); arr(["test","tva"]);. The
foreach binding will need to get the new array instance value, and the only way to do so is to re-evaluate the binding, which is what
getBindingAccessors does.
-- Michael