data method use the same triggerChange logic as val method