具有默认值的角度服务,用于不存在的属性

时间:2015-09-04 16:01:52

标签: javascript angularjs ionic

使用可在Android和Windows中执行的Ionic应用程序。

有一些服务,例如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
    }
});
  

注意:我知道更好的方法是使用在Ionic实施或制作之间选择的服务,但这只是为了学习。

理想的会更进一步,能够返回更加防弹的东西会很棒。类似于通用的灵活服务:

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

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

有可能吗?

3 个答案:

答案 0 :(得分: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;
    }
}

我希望这会对你有所帮助。

答案 1 :(得分:0)

基于对象属性对每个分配使用评估,类似于:

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

基本上你正在使用检查是否已定义属性,如果没有,则替换默认值,如果有,则指定它。

或者,您可以在Sunny的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";
}

希望有所帮助,

答案 2 :(得分:-3)

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