使用iScroll拉取指令AngularJS内部的刷新

时间:2013-07-30 19:49:02

标签: angularjs angularjs-directive iscroll pull-to-refresh

编辑:我更新代码块,因为我做了更改,错误在底部

所以我在我的指令里面。我想刷新页面。 (比如滚动刷新后)

以角度方式做到这一点的正确角度方法是什么? (我可以用jquery破解它,但我试图以角度方式做事)

我的计划是获取我目前所处的网址。 然后设置$ location.path(我当前的url);

它不起作用,因为我似乎无法弄清楚我当前的网址是什么。

// USAGE: <div alert-bar alertMessage="myMessageVar"></div>
angular.module('foo.directives').
directive('iScroll', ['$rootScope', '$parse', '$location', function($rootScope, $parse,    $location) {
   return {
   restrict: 'C',

link: function(scope, elem, attrs) {
  console.log("iscroll!");

 //document.addEventListener('touchmove', function (e) { e.preventDefault(); }, false);

 new iScroll('wrapper', { useTransition: false, bounce:true, vScroll:true,
  onScrollEnd: function ($location) {
    console.log("onScrollEnd");
    //x=$location.path();


      x=$location.url();
    console.log("url is "+x);

  },
} );
   }
}
}]);

现在产生

未捕获的TypeError:无法调用未定义的方法'url'

       // USAGE: <div alert-bar alertMessage="myMessageVar"></div>
        angular.module('foo.directives').
       directive('iScroll', ['$rootScope', '$parse', '$location', function($rootScope, $parse,    $location) {
   return {
   restrict: 'C',

link: function(scope, elem, attrs) {
  console.log("iscroll!");

 //document.addEventListener('touchmove', function (e) { e.preventDefault(); }, false);

 new iScroll('wrapper', { useTransition: false, bounce:true, vScroll:true,
  onScrollEnd: function ($location) {
    console.log("onScrollEnd");
    //x=$location.path();


      x=$location.path();
    console.log("path is "+x);

  },
} );
   }
}
}]);

现在产生

未捕获的TypeError:无法调用未定义的方法'path'

2 个答案:

答案 0 :(得分:2)

在你的指令定义中,$ location被注入$ parse并$ $解析为$ location。

日志中的对象是$ parse(来自角度来源):

$parse = function(exp) {
  switch(typeof exp) {
    case 'string':
      return cache.hasOwnProperty(exp)
        ? cache[exp]
        : cache[exp] =  parser(exp, false, $filter, $sniffer.csp);
    case 'function':
      return exp;
    default:
      return noop;
  }
};

这应该有效:

angular.module('foo.directives').directive('iScroll', ['$rootScope', '$parse', '$location', function($rootScope, $parse, $location) {
  return {
    restrict: 'C',
    link: function(scope, elem, attrs) {
      new iScroll('wrapper', { useTransition: false, bounce:true, vScroll:true,
        onScrollEnd: function () {
          console.log("onScrollEnd");
          console.log("url is " + $location.url());
        },
      });
    }
  }
}]);

答案 1 :(得分:0)

事实证明我知道如何做到这一点。获取当前位置&amp;然后将location.path()设置为相同的位置是一个相当差的刷新。

我所做的是在我的一个控制器中写一个刷新功能

    $scope.refresh = function() {

  return Headlines.get(queryId).then( function( headlines ) {
   // modify the view of the page you wanted to refresh here by updating your data 
  });

然后修改我的指令以调用该刷新函数。注意:你需要范围。$ apply(function(){}围绕刷新函数,否则它只会在iscroll完成操作页面之后发生。

angular.module('foo.directives').directive('iScroll', ['$rootScope', '$parse', '$location', function($rootScope, $parse, $location) {
  return {
  restrict: 'C',

link: function(scope, elem, attrs) {
  console.log("iscroll!");

  document.addEventListener('touchmove', function (e) { e.preventDefault(); }, false);

  new iScroll('wrapper', { useTransition: false, bounce:true, vScroll:true,
    onScrollEnd: function ($location) {
      console.log("onScrollEnd");


   scope.$apply(function() {
     scope.refresh();
   });

     },
    });
   }
  }        
}]);