Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ng repeat重复,但为空_Javascript_Angularjs_Soundcloud - Fatal编程技术网

Javascript ng repeat重复,但为空

Javascript ng repeat重复,但为空,javascript,angularjs,soundcloud,Javascript,Angularjs,Soundcloud,我正在使用Soundcloud API为输入到搜索框中的查询获取曲目,如下所示: $scope.tracks = []; $scope.updateResults=function(song){ if(song.length==0){ $scope.tracks = []; } if(song.length>3){ SC.get('/tracks', { q: song, license: '

我正在使用Soundcloud API为输入到搜索框中的查询获取曲目,如下所示:

$scope.tracks = [];

$scope.updateResults=function(song){
        if(song.length==0){
            $scope.tracks = [];
        }
        if(song.length>3){
            SC.get('/tracks', { q: song, license: 'cc-by-sa' }, function(tracks) {
                $scope.tracks = tracks;
                            //$scope.$apply() doesn't work either
            });
        }
    }
只要在搜索栏中键入内容,就会调用
$scope.updateResults
。这一切都很好。我甚至尝试过记录
$scope.tracks
,这是一个数组,它由匹配搜索结果的轨迹填充。根据Soundcloud API参考,每首曲目都有一个
标题
属性。我通过以下方式对此进行了测试:

console.log($scope.tracks[0].title)
,我得到了一个很好的标题字符串

现在在我的
ng repeat
中,它是这样写的:

<ul>
    <li ng-repeat="track in tracks">{{track.title}}</li>
</ul>
  • {{track.title}
我有几个要点,但都是空的。换句话说,
{{track.title}}
不存在吗?我已经测试过这是一个有效的属性。此外,我知道正在填充
$scope.tracks
,因为确实有列表项,但它们都是空的

谢谢你的帮助


编辑:我对
ng repeat
做了一些研究,了解到它会监视更新,例如
.push()
。。。仍然不应该解释这种奇怪的行为,但它可能有助于识别问题

这将不是对正在发生的事情的最技术性的解释,所以我感谢所有编辑。由于Soundcloud Javascript SDK不使用$http获取曲目,因此当SC.get返回曲目时,作用域不知道它需要更新。换句话说,即使填充了$scope.tracks,它也不知道如何更新视图。我建议编写一个服务来处理对Soundcloud的所有GET/POST/PUT/DELETE请求。下面是一个使用回调的简单示例:

.factory('Soundcloud', function($http, $rootScope, $timeout, $q) {

  var request = function(method, path, params, callback) {
    params.client_id = sc.soundcloud.client_id;
    params.oauth_token = sc.soundcloud.access_token;

    $http({
      method: method,
      url: sc.soundcloud.api.host + path,
      params: params
    })
    .success(callback);
  };

  return {
    get: function(path, params, callback) {
      request('GET', path, params, callback);
    },

    put: function(path, params, callback) {
      request('PUT', path, params, callback);
    },

    post: function(path, params, callback) {
      request('POST', path, params, callback);
    },

    delete: function(path, params, callback) {
      request('DELETE', path, params, callback);
    }
  };
})
将服务注入控制器后,您会得到如下跟踪:

Soundcloud.get('/tracks', {limit: 5}, function(tracks) {
  $scope.tracks = tracks;
});

只需设置服务获取客户端id和oauth令牌的位置。然后,路径是您想要的任何端点,params是您想要传递给SC的任何参数。

我怀疑问题与
ngRepeat
无关。尝试在ngRepeat`外部写入{tracks[0].title}}}以验证这一点。标题到底是什么样的?对我来说很有用我贴了一个答案,但我还有一个问题。您是否只使用一个视图?轨迹是否显示在与搜索框相同的页面上?@hedgerh,是的,它们位于相同的
ng控制器中。我会试试你的答案,然后告诉你。谢谢@穆格斯,谢谢你。正如hedgerh所说,我认为区别在于,您自己发出HTTP请求,而没有SC API。我会试试这个方法。