потяните, чтобы обновить внутреннюю директиву AngularJS с помощью iScroll

редактировать: я обновляю блок кода по мере внесения изменений и ошибок внизу

так что я внутри своей директивы. Я хочу сделать обновление страницы. (например, после прокрутки для обновления)

Каков правильный угловой способ сделать это в угловом? (Я могу взломать его с помощью jquery, но я пытаюсь сделать что-то угловым)

мой план состоял в том, чтобы получить URL-адрес, по которому я сейчас нахожусь. А затем установите $location.path(мой текущий URL-адрес);

это не работает, потому что я не могу понять, какой у меня текущий 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);

  },
} );
   }
}
}]);

теперь дает

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

  },
} );
   }
}
}]);

теперь дает

Uncaught TypeError: невозможно вызвать метод «путь» неопределенного


person Frank Visaggio    schedule 30.07.2013    source источник
comment
начинаю думать, что, может быть, я должен бросить сюда ссылку $location: function(scope, elem, attrs)   -  person Frank Visaggio    schedule 31.07.2013


Ответы (2)


В определении вашей директивы $location вводится в $parse, а $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());
        },
      });
    }
  }
}]);
person Bastien Caudan    schedule 30.07.2013
comment
да, ошибка Uncaught TypeError: невозможно вызвать метод «путь» неопределенного (обновлено исходное сообщение). я чувствую, что $location по какой-то причине работает неправильно. - person Frank Visaggio; 31.07.2013
comment
Вы не должны использовать $location в обратном вызове onScrollEnd - person Bastien Caudan; 31.07.2013
comment
отличная редакция еще раз спасибо за помощь! :) я также смог найти другой способ сделать это в angular, который может быть лучше, чем моя первоначальная идея переключения $location.path для обновления - person Frank Visaggio; 31.07.2013

Получается, я понял, как это сделать. получение вашего текущего местоположения, а затем установка 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 
  });

а затем изменить мою директиву, чтобы просто вызывать эту функцию обновления. ПРИМЕЧАНИЕ: вам нужна область видимости.

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

     },
    });
   }
  }        
}]);
person Frank Visaggio    schedule 30.07.2013