Javascript 具有不存在属性的默认值的角度服务

Javascript 具有不存在属性的默认值的角度服务,javascript,angularjs,ionic,Javascript,Angularjs,Ionic,在安卓和Windows中运行的Ionic应用程序上工作 有一些服务,例如Ionic的$ionicLoading,为了在windows中正常工作,我们会覆盖这些服务的功能: angular.factory('$ionicLoading', function(){ return { show: function (){...} // custom implementation hide: function (){...} // custom implement

在安卓和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
    }
});
注意:我知道更好的方法是让服务在爱奥尼亚的实现或自制实现之间进行选择,但这只是为了学习

理想的会走得更远,能够返回更防弹的东西将是非常美妙的。类似于通用的灵活服务:

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

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

有可能吗?

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

基于对象属性为每个赋值使用求值,类似于以下内容:

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";
}
希望有帮助


据我所知,您需要覆盖现有服务的实现。你可以用一个角度服务装饰器来完成

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

有关更多信息,请查看“角度”。一个简单的例子是:

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;
    }
}

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

这个问题在这里有一个很好的答案:我对Sunny的答案做了一些扩展,以帮助它适应这种情况。我还删除了你的-1评级-问题是我想覆盖
someService
在不知道其实现的情况下使用的所有方法。类似于
$delate.everyMethod=function(){return'hello world!';}