工厂返回相同的值

时间:2015-07-24 16:07:36

标签: javascript angularjs ionic

我正在尝试从soundcloud获取歌曲,我正在使用一些输入来设置值并将其发送到我的工厂以获取所有相关的歌曲列表并显示它。 问题是第一次全部正常工作,但当我尝试输入新值时,我得到的结果与第一次相同。

我的代码如下:

.controller('DashCtrl', function ($scope, SongsService) {
        $scope.formData = {};
        $scope.searchSong = function () {
            SongsService.setData($scope.formData.songName);
        };

更新

工厂:

.factory('SongsService', function ($rootScope) {
        var List = {};
        List.setData = function (tracks) {

            var page_size = 6;
            SC.get('/tracks', {limit: page_size, linked_partitioning: 1}, function (tracks) {
                // page through results, 100 at a time
                List = tracks;
                $rootScope.$broadcast('event:ItemsReceived');
            });
        };
        List.getItems = function () {
            return List;
        };
        return List;
    }).value('version', '0.1');

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

如果没有一个plunkr重现问题并显示所有相关代码,很难说,但我认为你的问题是你在异步答案中覆盖了List变量,而List (我假设)是您最初从工厂返回的对象。

我在这里看到两个值得注意的概念:

角度工厂是一个单独的工厂,这意味着工厂函数只会在第一次注入之前被调用一次,并且它注入的每个控制器将使用它返回的相同对象引用。如果覆盖此对象引用,那么前一个值(控制器具有的)仍然是对原始对象的引用。

修改:事实上,通过覆盖List,您将创建一个甚至不再具有setData方法的新对象!

您可能希望将List私有化为SongsService,并从工厂中返回一个更复杂的对象,该对象在闭包中捕获List,并提供一些公共getter / setter方法它。 (如果你坚持要替换返回的List变量的内容,请清空对象并使用新属性扩展它 - 包括再次使用此方法。但这是更多的工作,而不是一个很好的解决方案。)

答案 1 :(得分:0)

在Angular Service构造函数和Factory方法中是单例对象。您需要返回一个可以调用的方法。您的代码示例不完整,因此很难分辨出发生了什么。您的工厂方法List对象返回了什么?

如果是这样,当第一次调用完成时,它会覆盖List对象,以便第二次无法调用setData方法。什么是SC对象,我在你的例子中看不到你是如何注入它的。你可能也想解决这个问题。

考虑这种可能的解决方案。

服务

Songs.$inject = ['$http'];
function Songs($http) {
    this.$http = $http;
}

Songs.prototype.getSongs = function(searchTerm) {
    return this.$http.get('http://someendpoint/songs', {searchTerm: searchTerm});
}
service('songs', Songs);

控制器

DashController.$inect = ['songs'];
functionDashController(songs) {
    this.songs = songs;
    this.results = [];
}

DashController.prototype.searchSongs = function(searchTerm) {
    var self = this;
    this.songs.getSongs(searchTerm).then(function(results) {
        this.results = results;
    });
}
controller('DashController', DashController);

此示例使用此处说明的最佳做法controllerAs语法:http://toddmotto.com/digging-into-angulars-controller-as-syntax/

答案 2 :(得分:0)

我发现了这个问题, 我一直得到相同的结果,因为我没有使用cooreclty soundcloud的api,我没有在api上发送标题...你也是正确的,我不应该把列表设置为空..我应该设置一些值为列表......