aurelia避坑:绑定、路由与迁移逻辑
aurelia避坑的关键不是背更多API,而是看懂数据流、依赖作用域和组件生命周期。很多诡异问题,其实来自混用一代与二代教程、误判绑定方向,或把副作用放错阶段。本文从底层逻辑拆开四类高频坑,并给出一套比反复重装依赖更有效的排查顺序。
先说结论:大多数坑都不是框架失灵
Aurelia代码看起来接近原生HTML,容易让人产生“随便写也能跑”的错觉。真正进入路由、表单和服务层后,系统会同时涉及模板绑定、观察机制、DI容器和生命周期。任何一层理解错位,表面症状都可能只是页面没刷新。aurelia避坑要先建立一张脑内地图:数据从哪里来、由谁持有、何时绑定、组件销毁后谁负责清理。按这四问排查,比盯着某一行模板反复改属性名靠谱得多。([docs.aurelia.io](https://docs.aurelia.io/getting-to-know-aurelia/services-and-runtime-hooks/dependency-injection?utm_source=openai))
版本坑:Aurelia 1代码不能直接当2代教程
最凶的翻车点是搜索到旧文章后照抄。Aurelia 2是重新实现,核心理念延续,但部分API已经变化:例如事件绑定中的`.delegate`改用`.trigger`,`<compose>`调整为`<au-compose>`,部分生命周期和模块加载方式也不同。维护老项目时,先看`package.json`里的包名;迁移项目可先用`@aurelia/compat-v1`降低一次性改造压力,再逐模块移除兼容层。千万别一边用2代启动代码,一边拼1代插件,报错会像套娃。([docs.aurelia.io](https://docs.aurelia.io/migrating-to-aurelia-2/migrating-to-aurelia-2?utm_source=openai))
绑定坑:bind不是所有场景都双向
很多人看到输入框的`value.bind`能双向同步,就默认所有`.bind`都如此。实际逻辑是Aurelia根据目标决定模式:输入框等表单属性通常自动双向,大多数普通属性及自定义组件的bindable属性默认偏向单向传入。于是父组件传值后,子组件内部改了数据,父级却没变化,这并非监听失效,而是方向本来就没向上走。处理方法是明确写出`.two-way`,或重新设计为事件通知,避免子组件偷偷修改父状态。([docs.aurelia.io](https://docs.aurelia.io/components/bindable-properties?utm_source=openai))
作用域坑:服务能注入不等于实例正确
DI解决的是依赖创建与获取,但注册生命周期仍由开发者决定。把购物车、编辑草稿这类共享状态注册成每次新建,页面一跳转数据就丢;把弹窗控制器、表单校验状态做成全局单例,又可能让不同页面互相污染。排查时给服务实例临时加编号,观察切换组件后编号是否符合预期。单例适合全局配置与认证状态,临时服务适合无状态任务,页面级状态则应考虑作用域实例。([docs.aurelia.io](https://docs.aurelia.io/getting-to-know-aurelia/services-and-runtime-hooks/dependency-injection?utm_source=openai))
生命周期坑:能加载不代表能安全离开
路由组件不只负责展示,还要处理进入、加载、离开和清理。Aurelia路由提供`canLoad`、`loading`、`canUnload`、`unloading`等阶段:权限判断放进入前,数据请求放加载阶段,未保存表单的确认放离开前,订阅与定时器则在解绑或卸载时清理。最终的避坑顺序很简单:先确认版本,再确认绑定方向,然后检查DI实例,最后核对生命周期。顺序别反,不然很容易用路由补丁掩盖数据流问题。([docs.aurelia.io](https://docs.aurelia.io/getting-to-know-aurelia/aurelia-router?utm_source=openai))
常见问题
Aurelia页面数据变化后为什么不更新?
先确认修改的是被模板绑定的同一个对象,再检查绑定方向。若数据来自异步请求,还要排查组件是否已离开、请求结果是否写入了旧实例。
Aurelia 1项目必须一次性迁移到Aurelia 2吗?
不必。可以先建立Aurelia 2外壳并加入兼容包,让项目跑起来,再按组件、服务和路由逐步替换,降低整站同时爆错的风险。([docs.aurelia.io](https://docs.aurelia.io/migrating-to-aurelia-2/migrating-to-aurelia-2?utm_source=openai))
组件销毁后定时器还在运行怎么办?
保存定时器或订阅句柄,在组件解绑、卸载阶段显式清理。不要只依赖页面元素消失,DOM没了不代表后台副作用自动停止。