2015-09-04 60 views
9

使用在Android和Windows中执行的Ionic应用程序。带有默认值的非现有属性的角度服务

有服务,如离子的$ionicLoading,这是我们为了覆盖功能,在Windows正常工作:

angular.factory('$ionicLoading', function(){ 
    return { 
     show: function(){...} // custom implementation 
     hide: function(){...} // custom implementation 
    } 
}); 

但是,有一些我们不得不只覆盖不打破应用等服务。 在这种情况下,提供不会做任何事的服务将非常有用。例如:

angular.factory('$ionicExampleService', function(){ 
    return { 
     *foo*: angular.noop // for operations 
     *bar*: promise // returns promise 
    } 
}); 

注:我知道这样做的更好的方式是与离子的实施或提出一个之间选择一个服务,但是这仅仅是学习的缘故。

理想将进一步持续,这将是宏伟的,以便能够回到更防弹东西。就像通用的灵活服务:

angular.factory('$ionicPopup', function(){ 
    return /*magic*/; 
}); 

$ionicPopup.show({...}) // show was not defined 
    .then(foo); // won't break and will execute foo() 

这是可能的吗?

+6

此问题在这里有一个非常好的答案:http://stackoverflow.com/questions/6600868/set-default-value-of-javascript-object-attributes – sunny

+0

我扩大了一点在Sunny的答案,以帮助它适合情况。我也删除了你的-1评级。 -C§ – CSS

回答

-3

使用var a = {};来声明新变量。

0

使用基于对象属性的每项任务进行评价,与此类似:

myVar = myObj.myPropVar === undefined ? "default replacement" : myObj.myPropVar; 

基本上你正在使用的,如果财产已经定义的检查,替换默认值,如果它不是招” t,并且如果它已经分配了它。

或者,您可以使用Sunny's linkback中全局函数的修改版本来定义所有这些属性的默认值,您可能会认为这些属性在代码中的特定点处未定义。

function getProperty(o, prop) { 
    if (o[prop] !== undefined) return o[prop]; 
    else if(prop == "foo") return "default value for foo"; 
    else if(prop == "bar") return "default value for bar"; 
    /* etc */ 
    else return "default for missing prop"; 
} 

希望帮助,

4

从我的理解,你需要重写执行现有的服务。你可以用角色服务装饰器来做到这一点。

服务装饰器拦截服务的创建,允许它覆盖或修改服务的行为。装饰器返回的对象可能是原始服务,也可能是一个新的服务对象,它替换或打包并委托给原始服务。

欲了解更多信息,你可以检查角documentation。一个简单的例子是:

app.factory('someService', function() { 
    return { 
     method1: function() { return '1'; } 
     method2: function() { return '2'; } 
    }; 
}); 

app.decorator('someService', function ($delegate) { 
    // NOTE: $delegate is the original service 

    // override method2 
    $delegate.method2 = function() { return '^2'; }; 

    // add new method 
    $delegate.method3 = function() { return '3'; }; 

    return $delegate; 
}); 

// usage 
app.controller('SomeController', function(someService) { 
    console.log(someService.method1()); 
    console.log(someService.method2()); 
    console.log(someService.method3()); 
}); 

编辑:问题 - 如何覆盖服务中的每个方法?

var dummyMethod = angular.noop; 

for(var prop in $delegate) { 
    if (angular.isFunction($delegate[prop])) { 
     $delegate[prop] = dummyMethod; 
    } 
} 

我希望这可以帮助你。

+0

问题是我想重写'someService'的每个方法,而不知道他的实现。像'$ delate.everyMethod = function(){return'hello world!'; };' – fuxes