简体   繁体   中英

Accessing $scope data from view to factory in AngularJs

How can I access $scope data from view to my factory in angularjs? I can access $scope.items from my controller, but when I need to use it in my factory to use the data and generate a pdf I cannot access it.

angular.module('myApp', [])

.controller('myCtrl', function($scope, $http, testFactory) {

$scope.link = "http://localhost:3450/loading.html";
      testFactory.all().then(
        function(res){
          $scope.link = res;
        },
        function(err){
          console.log(err);
        }
      );

})

.factory('testFactory', function($q){

  var pdfInfo = {
    content: [
     //data should be here...
    ]
  };

  var link = {};
  function _all(){
    var d = $q.defer();
      pdfMake.createPdf(pdfInfo).getDataUrl(function(outputDoc){
        d.resolve(outputDoc);
      });
    return d.promise;
  }
  link.all = _all;
  return link;
});

I used factory when I click the generate button from my view, it will wait until the pdf is generated. Coz when I did not do it this way before, I need to click the button twice just to get the pdf generated.

I did it. I forgot to send the $scope.items to my factory. So what i did is I added testFactory.all($scope.items) in my controller instead of just plain testFactory.all() .

Then in my factory,

I used function _all(value) , so I can used the values passed by the views through controller. I am not sure if this is the proper way, but it works. Please suggest good practice if you have.

It is a bad practice to move around $scope to other services, as they may change it and effect your controller logic. It will make a coupling between controllers to other services. If your factory requires data from the controller, it is better to just pass those parameters to the factory's function.

EDIT: I see you managed to do that, and yes - passing $scope.items is the preferred way (and not, for example, passing $scope).

You can just pass the data to your factory as a function parameter.

angular.module('myApp', [])

.controller('myCtrl', function($scope, $http, testFactory) {

    var pdfInfo = {
        content: $scope.items
    };

    $scope.link = "http://localhost:3450/loading.html";
    testFactory.all(pdfInfo).then(
        function(res) {
            $scope.link = res;
        },
        function(err) {
            console.log(err);
        }
    );

})

.factory('testFactory', function($q) {

    var link = {};

    function _all(pdfInfo) {
        var d = $q.defer();
        pdfMake.createPdf(pdfInfo).getDataUrl(function(outputDoc) {
            d.resolve(outputDoc);
        });
        return d.promise;
    }
    link.all = _all;
    return link;
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM