【问题标题】:How to call nest factory in Angularjs?如何在Angularjs中调用嵌套工厂?
【发布时间】:2017-08-20 03:19:52
【问题描述】:

您好,我正在用 angularjs 开发 Web 应用程序。我有以下要求。我有一个工厂。我在下面添加了代码 sn-p。

myapp.factory('sadadpaymentapi', ['$http', '$cookieStore', 'cfg', 'ScrollFunction', 'leaselisting', function ($http, $cookieStore, cfg, ScrollFunction, leaselisting) {
    var sadadpaymentapiobject = {};
    var baseurl = cfg.Baseurl;
    var LoginID = $cookieStore.get("LoginID");
    var cookiePreferredLanguage = $cookieStore.get('PreferredLanguage');
    var urlapi = baseurl + "api/ServiceRequest/CreateRSSedad/";
    sadadpaymentapiobject.callsadad = function (PaymentType) {
        leaselisting.leaselisting().then(function (response) {
        //Problem in calling
        }, function (error) { });
        var request = {
            url: urlapi,
            method: 'POST',
            data: {
                SRActivityID: LoginID,
                PaymentType: PaymentType,
                PaymentAmount: "100"
            },
            headers: ScrollFunction.getheaders()
        };
        return $http(request);
    }
    return sadadpaymentapiobject;
}]);

这是我的第二个工厂租赁清单

myapp.factory('leaselisting', ['$http', '$cookieStore', 'cfg', 'ScrollFunction', function ($http, $cookieStore, cfg, ScrollFunction) {
    var leaselistingobject = {};
    var baseurl = cfg.Baseurl;
    var LoginID = $cookieStore.get("LoginID");
    var cookiePreferredLanguage = $cookieStore.get('PreferredLanguage');
    leaselistingobject.leaselisting=function(){
    var requestObj = {
        url: "api/ServiceRequest/GetROLSPSRLeaseList/",
        data: {
            LoginID: LoginID,
            RSAccountNumber: $cookieStore.get("AccountNumber")
        },
        headers: ScrollFunction.getheaders()
    };
    $http(requestObj).then(function (response) {
    }, function (error) {
    });
    }
    return leaselistingobject;
}]);

我在下面的行中发现了错误

 leaselisting.leaselisting().then(function (response) { //Problem in calling
        }, function (error) { });

我可以在上面的代码中做错什么吗?我可以知道是否可以从另一个工厂调用一个工厂?我从租赁列表中得到的响应我想将它传递给 sadadpaymentapi 的 calladad 函数。那么有人可以在上面的代码中帮助我吗?我收到错误 Cannot read property 'then' of undefined in the leaselisting.leaselisting().then(function (response) {},function(error){});

还有什么方法可以直接注入工厂,比如支付金额:注入工厂这样的东西?

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    我假设leaselistingobject.getValue 是一个异步函数。 所以首先要获得你的价值:

    leaselistingobject.getValue = function(){
       var requestObj = {
           url: "api/ServiceRequest/getValue/"
       };
       return $http(requestObj).then(function (response) {
            return response.data;
        });
    }
    

    然后使用它。为了让所有异步操作完成,我们使用 angulars $q.Here 你可以找到一个小教程。

    myapp.factory('sadadpaymentapi', ['$http', '$cookieStore', 'cfg', 'ScrollFunction', 'leaselisting', '$q',function ($http, $cookieStore, cfg, ScrollFunction, leaselisting, $q) {
    var sadadpaymentapiobject = {};
    var baseurl = cfg.Baseurl;
    var LoginID = $cookieStore.get("LoginID");
    var cookiePreferredLanguage = $cookieStore.get('PreferredLanguage');
    var urlapi = baseurl + "api/ServiceRequest/CreateRSSedad/";
    sadadpaymentapiobject.callsadad = function (PaymentType) {
        var leastListingPromise = leaselisting.leaselisting();
        var getValuePromise = leaselisting.getValue();
    $q.all([leastListingPromise, getValuePromise]).then(function (responses) { 
        //Here you have both responses in an array
        var request = {
            url: urlapi,
            method: 'POST',
            data: {
                SRActivityID: LoginID,
                PaymentType: PaymentType,
                PaymentAmount: responses[1]
            },
            headers: ScrollFunction.getheaders()
        };
        return $http(request);
    
    
        });   
    }
    return sadadpaymentapiobject;
    }]);
    

    为了让leaselisting()返回请求的响应,改变函数的结尾

    $http(requestObj).then(function (response) {
    }, function (error) {
    });
    

    return $http(requestObj).then(function (response) {
        return response.data;
    }, function (error) {
    });
    

    如果对可能的错误不做任何事情,你可以省略错误函数部分:

    return $http(requestObj).then(function (response) {
        return response.data;
    });  
    

    【讨论】:

    • 好的,谢谢。是否可以做一些支付金额:注入工厂并分配值。谢谢
    • 抱歉,我不确定你的意思。
    • 在sadadpaymentapi 工厂我有callsadad 方法。在该方法中,我有三个输入参数,例如 sractivituid、paymenttype 和支付金额。现在我想为租赁工厂的付款金额分配值,所以我可以做一些付款金额:从租赁清单 API 获取价值。
    • 所以您希望例如leaselistingobject.getValue 返回一个您想要分配给sadadpaymentapiobject.callsadad 中的PaymentAmount 的数字?请努力命名。这很混乱
    • 感谢您的回答。我正在尝试实施。我得到的供应商租赁清单必须从 $get 工厂方法返回一个值。我该如何解决这个问题?
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 2018-09-27
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 2015-10-28
    相关资源
    最近更新 更多