为什么Angular需要包装器?

时间:2014-12-26 12:49:40

标签: javascript angularjs

我仍然不了解Angular的一件事是...... 当我可以使用窗口全局对象并获得相同的结果时,为什么要使用$ window?为什么在使用setTimeout等时使用$ timeout。

我有时使用这个原生的javascript代码并且它工作正常,那么为什么AngularJS首先创建了这些包装器?

1 个答案:

答案 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']);
       });
   });