在AngularJs中从视图访问$ scope数据

时间:2016-11-04 12:03:15

标签: javascript angularjs pdf

如何在angularjs中从视图访问我的工厂的$ scope数据?我可以从我的控制器访问$ scope.items,但是当我需要在工厂使用它来使用数据并生成pdf时我无法访问它。

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

当我从视图中单击生成按钮时,我使用工厂,它将等到生成pdf。因为我之前没有这样做,我需要点击两次按钮才能生成pdf。

3 个答案:

答案 0 :(得分:0)

我做到了。我忘了将$scope.items发送到我的工厂。所以我所做的是在控制器中添加了testFactory.all($scope.items),而不仅仅是testFactory.all()

然后在我的工厂,

我使用function _all(value),因此我可以使用视图通过控制器传递的值。我不确定这是否是正确的方法,但它确实有效。如果有,请建议好的做法。

答案 1 :(得分:0)

将$ scope移动到其他服务是一种不好的做法,因为它们可能会改变它并影响控制器逻辑。它将使控制器与其他服务之间形成耦合。 如果您的工厂需要来自控制器的数据,最好将这些参数传递给工厂的功能。

编辑:我看到你设法做到了,是的 - 传递$ scope.items是首选的方式(而不是,例如,传递$ scope)。

答案 2 :(得分:0)

您只需将数据传递给工厂即可 功能参数。

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