### Executive summary
- I tried that but it results in a **smelly design** IMHO (as explained below).
- `NgValue`, etc. are subordinate directives and their `element` fields should never be null.
- Rewriting `NgTrueValue` using the alternative design I propose makes it conceptually cleaner and it shrinks from 17 lines to 9 lines or less.

### Details

Let's look at the code of `NgTrueValue`:
```dart
class NgTrueValue {
  final dom.Element element;
  @NgOneWay('ng-true-value')
  var value;

  NgTrueValue(this.element);

  readValue(dom.Element element) {
    assert(this.element == null || element == this.element);
    return this.element == null ? true : value;
  }

  bool isValue(dom.Element element, value) {
    assert(this.element == null || element == this.element);
    return this.element == null ? toBool(value) : value == this.value;
  }
}
```
Notice that the current design forces `readValue()` and `isValue()` to
- **have an extra `element` argument**
- **test `element` for null** (
- need extra explanation (API docs) that says that **the only legal values for `element` are**
  - `null` or 
  - **the value that the instance already has in its `this.element` field!**
- with an extra test for null**

**`NgTrueValue` is a subordinate directive that should never have a null `element` field.** Thus, rewriting `NgTrueValue` using the design I propose would result in:
```dart
class NgTrueValue {
  final dom.Element element;
  @NgOneWay('ng-true-value')
  var value;

  NgTrueValue(this.element);

  bool isValue(value)  => value == this.value;
}
```
Note that:
- we can drop `readValue()` because it would just return `value`.
- In fact, `isValue()` is now trivial and could be dropped too.

Let me know what you think of this alternative approach.