code: function () {
      var atts = this.atts, att, ctlAtt, eh = this.eh, ctl = this.controller, v;
      var vs = this.isCptAttElement? this.vscope : this.parent.vscope;
      if (atts && ctl && ctl.$attributes) {
        // this template has a controller
        // let's propagate the new attribute values to the controller attributes
        for (var i = 0, sz = this.atts.length; sz > i; i++) {
          att = atts[i];
          ctlAtt = ctl.$attributes[att.name];
          // propagate changes for 1- and 2-way bound attributes
          if (ctlAtt.type!=="template" && ctlAtt._binding !== 0) {
            v = att.getValue(eh, vs, null);
            if (ctlAtt.type==="object" || ctlAtt.type==="array") {
              json.set(ctl, att.name, v);
            } else if ('' + v != '' + ctl[att.name]) {
              // values may have different types - this is why we have to check that values are different to
              // avoid creating loops
              json.set(ctl, att.name, v);
            }
          }
        }
      }
    }
docs: Refresh the node attributes (even if adirty is false)