我想使用ng-infinite-scroll(https://sroze.github.io/ngInfiniteScroll/)。但是当我想从我的服务调用函数(注入到控制器)时没有发生任何事情(此函数不会触发)。当我不是从服务调用函数而是从控制器的$ scope调用函数时 - 一切正常。如何在无限滚动指令中从注入的服务中调用函数?
我的HTML结构:
<div class="col-xs-12 publications-container" ng-controller="showPublicationsCtrl">
<h3 class="publ-heading">Proposed Publications</h3>
<ul class="list-group" infinite-scroll="publicationsFactory.getPublications()" infinite-scroll-disabled='publicationsFactory.busyLoadingData'>
<li ng-repeat="publication in publications" class="list-unstyled list-group-item" ng-cloak>
<p class="text-warning">Author: <i>{{publication.author}}, {{publication.timestamp | date: 'MMM. d, y'}}</i></p>
<p ng-text-truncate="publication.text" ng-tt-words-threshold="3">{{publication.text}}</p>
<p class="text-muted">Channels: <i>{{publication.channels.join(", ")}}</i></p>
</li>
</ul>
</div>
我的showPublicationsCtrl
控制器:
twitterApiApp.controller("showPublicationsCtrl", ['publicationsFactory', '$scope', function (publicationsFactory, $scope) {
publicationsFactory.getPublications();
$scope.publications = publicationsFactory.publications;
}]);
我的publicationsFactory
服务:
angular.module('twitterApiApp').factory('publicationsFactory', ['$http', function($http) {
var publicationsFact = {};
publicationsFact.publications = [];
publicationsFact.busyLoadingData = false;
publicationsFact.getId = function() {
publicationsFact.id = publicationsFact.publications.length > 0 ?
publicationsFact.publications[publicationsFact.publications.length-1]['id'] : 0;
};
publicationsFact.getPublications = function () {
console.log("Triggered");
if (publicationsFact.busyLoadingData) return;
publicationsFact.busyLoadingData = true;
publicationsFact.getId();
$http.get("/Publications?id_gte=" + publicationsFact.id + "&_limit=2").then(function(response) {
for (var i = 0; i < response.data.length; i++) {
publicationsFact.publications.push(response.data[i]);
};
});
publicationsFact.busyLoadingData = false;
};
return publicationsFact;
}]);
如果我在控制器中创建了一些函数,例如$scope.myFunction
,然后在HTML结构中,我将infinite-scroll
属性赋给myFunction()
,该函数将被成功执行。所以,我认为在控制器中注入服务的方式可能存在一些错误。但除了ng-inginite-scroll之外的所有其他内容都按计划进行。
答案 0 :(得分:1)
infinite-scroll
绑定到$ scope.publicationsFactory:
<ul class="list-group" infinite-scroll="publicationsFactory.getPublications()" infinite-scroll-disabled='publicationsFactory.busyLoadingData'>
但您的示波器中没有publicationsFactory
,您必须将其公开:
twitterApiApp.controller("showPublicationsCtrl", ['publicationsFactory', '$scope', function (publicationsFactory, $scope) {
// Expose publication factory
$scope.publicationsFactory = publicationsFactory;
publicationsFactory.getPublications();
$scope.publications = publicationsFactory.publications;
}]);
如何使用Factory
检索最新发布的$ scope.publications您的工厂可以返回使用最新出版物解决的承诺,更改您的代码:
angular.module('twitterApiApp').factory('publicationsFactory', ['$http', '$q', function($http, $q) {
var publicationsFact = {};
publicationsFact.publications = [];
publicationsFact.busyLoadingData = false;
publicationsFact.getId = function() {
publicationsFact.id = publicationsFact.publications.length > 0 ?
publicationsFact.publications[publicationsFact.publications.length - 1]['id'] : 0;
};
/**
* Get latest publications
* @returns {object} A promise
*/
publicationsFact.getPublications = function() {
var deferred = $q.defer();
console.log("Triggered");
if (publicationsFact.busyLoadingData) return;
publicationsFact.busyLoadingData = true;
publicationsFact.getId();
$http.get("/Publications?id_gte=" + publicationsFact.id + "&_limit=2").then(function(response) {
for (var i = 0; i < response.data.length; i++) {
publicationsFact.publications.push(response.data[i]);
};
// Resolve promise with updates publications list
deferred.resolve(publicationsFact.publications);
}, function(error) {
// Reject promise with error message
deferred.reject(error.message);
});
publicationsFact.busyLoadingData = false;
// Return promise
return deferred.promise;
};
return publicationsFact;
}]);
然后,在你的控制器中:
twitterApiApp.controller("showPublicationsCtrl", ['publicationsFactory', '$scope', function (publicationsFactory, $scope) {
// Expose publication factory
$scope.publicationsFactory = publicationsFactory;
publicationsFactory.getPublications()
.then(function(results) {
$scope.publications = results;
});
}]);
答案 1 :(得分:1)
您应该将此行添加到您的ctrl:
$scope.getPublications = publicationsFactory.getPublications;
然后从视图中调用ctrl函数。 这样,您就可以将对服务功能的绑定引用绑定到视图中可用的控制器范围。
编辑:另一种选择是将整个服务绑定到ctrl属性,就像其他人已经建议的那样