我仍然不了解Angular的一件事是...... 当我可以使用窗口全局对象并获得相同的结果时,为什么要使用$ window?为什么在使用setTimeout等时使用$ timeout。
我有时使用这个原生的javascript代码并且它工作正常,那么为什么AngularJS首先创建了这些包装器?
答案 0 :(得分:1)
它被集成到摘要周期中(将触发HTML编译器和DOM刷新)。还使代码更容易测试,因为您可以模拟$ timeout对象并测试它被调用。
例如,使用$ timeout,您可以在单元测试中调用$ timeout.flush(),它将表现为超时等待适当的时间并触发回调。这使得您的测试运行得更快,这对TDD也有好处。
这是一个简单的异步示例 - 假设asyncThing.method()使用$ timeout和$ log来输出消息
describe('Async test', function () {
var asyncThing, $timeout, $log;
beforeEach(module('async'));
beforeEach(inject(function (_asyncThing_, _$timeout_, _$log_) {
asyncThing = _asyncThing_;
$timeout = _$timeout_;
$log = _$log_;
}));
it('should do some async stuff', function () {
asyncThing.method(some_arguments);
$timeout.flush();
expect($log.info.logs).toContain(['Some output']);
});
});