Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何用angularjs将数据从工厂传递到控制器?_Javascript_Angularjs_Angularjs Service_Angularjs Controller_Angularjs Factory - Fatal编程技术网

Javascript 如何用angularjs将数据从工厂传递到控制器?

Javascript 如何用angularjs将数据从工厂传递到控制器?,javascript,angularjs,angularjs-service,angularjs-controller,angularjs-factory,Javascript,Angularjs,Angularjs Service,Angularjs Controller,Angularjs Factory,我试图将所有业务逻辑从我的控制器移动到工厂,但在传递字段数据时遇到了一些问题 factory.js app.factory("Quote", function ($resource) { // TODO: this shouldn't start with /en/ var quoteStatus = []; var quoteLanguage = []; var Quote = $resource("/en/quote/api/quote/:id", {},

我试图将所有业务逻辑从我的控制器移动到工厂,但在传递字段数据时遇到了一些问题

factory.js

app.factory("Quote", function ($resource) {
    // TODO: this shouldn't start with /en/
    var quoteStatus = [];
    var quoteLanguage = [];

    var Quote = $resource("/en/quote/api/quote/:id", {}, {
        retrieve: {
          method: 'GET',
          params: {},
          isArray: true
        },
        query: {
          method: 'GET',
          params: {},
          isArray: true,
          url: '/en/quote/api/quote/'           
        },
        fields: {
          method: 'GET',
          url: '/en/quote/api/quote/fields/ '
        },
        update: {
          method: 'PATCH',
        },
    });

    Quote.fields().$promise.then(function (fields) {
        var tempObj = [];
        for (key in fields.status) {
            // must create a temp object to set the key using a variable
            tempObj[key] = fields.status[key];
            quoteStatus.push({
                value: key,
                text: tempObj[key]
            });
        }

        for (key in fields.language) {
            // must create a temp object to set the key using a variable
            tempObj[key] = fields.language[key];
            quoteLanguage.push({
                value: key,
                text: tempObj[key]
            });
        }

        //$scope.addLanguage($scope.language);

        Quote.status = quoteStatus;
        Quote.language = quoteLanguage;
    });

    return Quote;


});
$scope.quoteStatus = Quote.status;
controller.js

app.factory("Quote", function ($resource) {
    // TODO: this shouldn't start with /en/
    var quoteStatus = [];
    var quoteLanguage = [];

    var Quote = $resource("/en/quote/api/quote/:id", {}, {
        retrieve: {
          method: 'GET',
          params: {},
          isArray: true
        },
        query: {
          method: 'GET',
          params: {},
          isArray: true,
          url: '/en/quote/api/quote/'           
        },
        fields: {
          method: 'GET',
          url: '/en/quote/api/quote/fields/ '
        },
        update: {
          method: 'PATCH',
        },
    });

    Quote.fields().$promise.then(function (fields) {
        var tempObj = [];
        for (key in fields.status) {
            // must create a temp object to set the key using a variable
            tempObj[key] = fields.status[key];
            quoteStatus.push({
                value: key,
                text: tempObj[key]
            });
        }

        for (key in fields.language) {
            // must create a temp object to set the key using a variable
            tempObj[key] = fields.language[key];
            quoteLanguage.push({
                value: key,
                text: tempObj[key]
            });
        }

        //$scope.addLanguage($scope.language);

        Quote.status = quoteStatus;
        Quote.language = quoteLanguage;
    });

    return Quote;


});
$scope.quoteStatus = Quote.status;
但是,这不起作用,因为$scope.quoteStatus未定义。我错过了什么


提前感谢。

您不能期望异步操作以同步方式运行

基本上,当控制器在其工厂函数中注入
Quote
时,就会创建
Quote
服务对象,然后调用Quote.fields()。当您询问
Quote时,控制器内的状态将始终返回未定义。您没有在任何地方维护承诺,这样控制器就会知道数据是否准备就绪

我认为您应该在那里引入
$q.when
标志来检查
Quote.fields()
操作是否完成&然后在那里获得所需的变量

为了实现上述内容,您需要在服务中的某个地方存储
Quote.fields()
call的承诺。如下

var quoteFieldsPromise = Quote.fields().$promise.then(function (fields) {

   /// the code will be same here

};
然后添加新方法,该方法将保存
quoteFieldsPromise
promise对象,并返回
quoteStatus
&
quoteLanguage
的值

var getQuoteDetails = function(){
   $q.when(quoteFieldsPromise).then(function(){
      return { quoteStatus: Quote.quoteStatus, quoteLanguage: Quote.quoteLanguage };
   })
}
但是您返回整个
Quote
对象的方式,它只有
$resource
对象,需要更改。我的意思是说,我创建的
getQuoteDetails
方法不能与
Quote
对象一起返回。所以我宁愿重构下面的服务

服务

app.factory("Quote", function($resource, $q) {
    // TODO: this shouldn't start with /en/
    var quoteStatus = [], //kept private if needed
        quoteFieldsPromise, 
        quoteLanguage = [];//kept private if needed

    var QuoteApi = $resource("/en/quote/api/quote/:id", {}, {
        //inner code is as is 
    });

    //preserve promise of .fields() call
    quoteFieldsPromise = Quote.fields().$promise.then(function(fields) {
        //inner code is as is 
        //below lines are only changed.

        Quote.status = quoteStatus;
        Quote.language = quoteLanguage;
    });

    var getQuoteDetails = function() {
        return $q.when(quoteFieldsPromise).then(function() {
            return {
                quoteStatus: quoteStatus,
                quoteLanguage: quoteLanguage
            };
        })
    };

    return {
        QuoteApi: QuoteApi,
        getQuoteDetails: getQuoteDetails
    };
});
控制器

Quote.getQuoteDetails().then(function(quoteDetails){
    $scope.quoteStatus = quoteDetails.quoteStatus;
    $scope.quoteStatus = quoteDetails.quoteLanguage;
});

您不能期望异步操作以同步方式运行

基本上,当控制器在其工厂函数中注入
Quote
时,就会创建
Quote
服务对象,然后调用Quote.fields()。当您询问
Quote时,控制器内的状态将始终返回未定义。您没有在任何地方维护承诺,这样控制器就会知道数据是否准备就绪

我认为您应该在那里引入
$q.when
标志来检查
Quote.fields()
操作是否完成&然后在那里获得所需的变量

为了实现上述内容,您需要在服务中的某个地方存储
Quote.fields()
call的承诺。如下

var quoteFieldsPromise = Quote.fields().$promise.then(function (fields) {

   /// the code will be same here

};
然后添加新方法,该方法将保存
quoteFieldsPromise
promise对象,并返回
quoteStatus
&
quoteLanguage
的值

var getQuoteDetails = function(){
   $q.when(quoteFieldsPromise).then(function(){
      return { quoteStatus: Quote.quoteStatus, quoteLanguage: Quote.quoteLanguage };
   })
}
但是您返回整个
Quote
对象的方式,它只有
$resource
对象,需要更改。我的意思是说,我创建的
getQuoteDetails
方法不能与
Quote
对象一起返回。所以我宁愿重构下面的服务

服务

app.factory("Quote", function($resource, $q) {
    // TODO: this shouldn't start with /en/
    var quoteStatus = [], //kept private if needed
        quoteFieldsPromise, 
        quoteLanguage = [];//kept private if needed

    var QuoteApi = $resource("/en/quote/api/quote/:id", {}, {
        //inner code is as is 
    });

    //preserve promise of .fields() call
    quoteFieldsPromise = Quote.fields().$promise.then(function(fields) {
        //inner code is as is 
        //below lines are only changed.

        Quote.status = quoteStatus;
        Quote.language = quoteLanguage;
    });

    var getQuoteDetails = function() {
        return $q.when(quoteFieldsPromise).then(function() {
            return {
                quoteStatus: quoteStatus,
                quoteLanguage: quoteLanguage
            };
        })
    };

    return {
        QuoteApi: QuoteApi,
        getQuoteDetails: getQuoteDetails
    };
});
控制器

Quote.getQuoteDetails().then(function(quoteDetails){
    $scope.quoteStatus = quoteDetails.quoteStatus;
    $scope.quoteStatus = quoteDetails.quoteLanguage;
});

谢谢Pankaj,但是如何在控制器中使用
getQuoteDetails
?我试着在我的factory.js中将其设置为:
Quote.prototype.quotefeelds=function(){}
,但仍然没有定义。你帮了我很大的忙。非常感谢。@GustavoReyes很高兴为您服务..谢谢。谢谢Pankaj,但是我如何在控制器中使用
getQuoteDetails
?我试着在我的factory.js中将其设置为:
Quote.prototype.quotefeelds=function(){}
,但仍然没有定义。你帮了我很大的忙。非常感谢。@GustavoReyes很高兴为您服务。谢谢。