Not the best example perhaps but I think it does have some merit.
I think:
<p>{{item.name}}</p> {{adBox}}
Is a lot better readable than:
<p>{{item.name}}</p> {{component item.adBoxComponent item=item}}
It does have some obfuscation on what adBox does with what. But the question is whether it should be enforced to make that clear in the template. Should how we render something, how we bind data to the html, contain so much wiring?
<p>{{item.name}}</p> {{itemAdBox}}
Proper naming makes it a bit clearer. We’re not sure which component is going to be used. But we can’t see that either when using the computed property.
On a side note: you made the item decide how it should be rendered. But this would really be up to the component rendering the item, not the model itself, but that’s beyond the scope of your argument.
Extreme readability of the template isn’t my goal though. I think maintainability is much more important. Let say we started with this:
<p>{{item.name}}</p> {{item-ad-box item=item}}
I have several templates using this way of including the item-ad-box. I now have determined I need another component to render the on sale item in another component. Since I don’t want to have to change all my templates to:
<p>{{item.name}}</p> {{component this.adBoxComponent item=item}}
I’m going to need 3 components. The item-ad-box, item-ad-box-default and item-ad-box-sale. The item-ad-box will determine which actual ad-box needs to be shown. While I don’t want that extra component, I could live with that. But in the end I think this will just be more obfuscating and complex than some well designed implicits.
Now assume we need an additional binding:
<p>{{item.name}}</p> {{item-ad-box item=item index=currentIndex}}
Now there is no way around editing all the templates using the item-ad-box. Or I need to work around it with some service, increasing complexity and decreasing cohesion.