2014-10-03 40 views
1

我正在使用Ionic与ngCordova一起构建移动应用程序。为了尽可能在浏览器中开发我希望覆盖ngCordova方法以在我的app.js的配置块中使用$provide来返回模拟响应(因为它们取决于设备功能)。

事情是这样的:

.config(function($stateProvider, $urlRouterProvider, $provide) { 

    if(!window.cordova) { 
     $provide.value('$cordovaCapture', { 
      captureImage: function() { 
       return { 
        end: 0, 
        fullPath: "http://static2.shop033.com/resources/18/160536/picture/A1/85135265.jpg", 
        lastModified: null, 
        lastModifiedDate: 1412269066000, 
        localURL: "cdvfile://localhost/temporary/device-specific-file.jpg", 
        name: "photo_013.jpg", 
        size: 440614, 
        start: 0, 
        type: "image/jpeg" 
       } 
      } 
     }); 
    } 

} 

然而,ngCordova captureImage方法返回一个承诺,我不能模拟与$q承诺由于事实,你不能在.config块注入$q

有没有不同的地方,我可以使用$provide覆盖这些服务连同$q

回答

3

您应该使用工厂而不是值来注射。

.config(function($stateProvider, $urlRouterProvider, $provide) { 

    if(!window.cordova) { 
     $provide.factory('$cordovaCapture', function($q){ 
      return { 
       captureImage: function() { 
        // Use $q here 
        return { 
         end: 0, 
         fullPath: "http://static2.shop033.com/resources/18/160536/picture/A1/85135265.jpg", 
         lastModified: null, 
         lastModifiedDate: 1412269066000, 
         localURL: "cdvfile://localhost/temporary/device-specific-file.jpg", 
         name: "photo_013.jpg", 
         size: 440614, 
         start: 0, 
         type: "image/jpeg" 
        }; 
       } 
      }; 
     }); 
    } 

} 
0

你需要做的是使用$provide.decorator()。如文档中定义:

服务装饰截取的服务的创建,允许它 到重写或修改的行为服务的。装饰器返回的对象 可能是原始服务,或者是替换或包装并委托原始服务的新服务对象。

代码应该是这样的:

.config(function($stateProvider, $urlRouterProvider, $provide) { 

    if(!window.cordova) { 
     $provide.decorator('$cordovaCapture', ['$delegate', '$q', function($delegate, $q) { 

      var createResolver = function(mockupOptions) { 
       return function(options) { 
        var deferred = $q.defer(); 
        deferred.resolve(mockupOptions); 
        return deferred.promise; 
       }; 
      }; 

      $delegate.captureAudio = createResolver({ 
       // captureAudio default options 
      }); 

      $delegate.captureImage = createResolver({ 
       // captureImage default options 
      }); 

      $delegate.captureVideo = createResolver({ 
       // captureVideo default options 
      }); 

      return $delegate; 
     }); 
    } 

}; 

还有一两件事,在$delegate参数实际上是原来的服务,这是在上面的例子中$cordovaCapture的注入实例。

+1

如果服务不存在,调用装饰服务会失败吗?如果他在科尔多瓦运行,那么除了他在浏览器中运行外,还会有其他服务。这就是为什么我提出了有条件的服务添加,而不是有条件的服务修改。 – 2014-10-04 14:56:12