0

我有一个名为 itemService 的函数。从 shoppingList 控制器获取项目并将其推送到项目数组中,然后返回该数组。

现在我需要创建 2 个 shoppingLists 所以使用 .factory 我设法让两个控制器都获得不同版本的服务,当我通过第一个控制器推送一个项目时,第二个控制器的数组不会得到这个项目,它们现在被溅到了如何我可以使用 .provider 做同样的事情吗

function itemService (limit){
    let share = this;
    share.items=[];
    share.additem=function(N,Q){
        if(limit===undefined || limit>=share.items.length+1){
            let item={N,Q};
            share.items.push(item);
        }
        else {
            throw new Error("limit reached !")
        }  
    }
    share.getItems=function(){
        return share.items;
    }
}

function itemServiceFactory(){
    let factory = function(limit){
        return new itemService (limit);
    };
    return factory;
}
4

1 回答 1

0

工厂、提供者、服务,甚至价值和常数都是同一事物的不同版本。您可以将更通用的提供者分解为所有这些。像这样:1

从问题的第 1 版开始:

错误

function itemServiceProvider(){
    let provider=this;
    provider.defaults={limit:10};
    // now i need to make 2 separated version of the service
    provider.$get = function(){
        return new itemService (provider.defaults.limit);
    };
}

要将您的工厂转换为供应商:

app.provider("MyProvider", function() {
    let provider=this;
    provider.defaults={limit:10};
    provider.$get = function() {
        return function(){
            return new itemService (provider.defaults.limit);
        };
    };
    return provider;
});

用法:

app.controller("cntl", function(MyProvider) {
     var service1 = MyProvider();
     var service2 = MyProvider();
})

提供者、工厂和服务是单例的。$get 函数在应用程序的生命周期中只调用一次。该provider.$get函数需要返回一个构造新服务的函数。

有关详细信息,请参阅

于 2019-04-22T16:25:34.983 回答