2014-06-29 30 views
1

我使用的SoundCloud API为键入到搜索框,像这样的查询获取曲目:NG重复重复,但是是空的

$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参考,每个轨道都有一个title属性。我通过这样做了测试:

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

现在在我的ng-repeat,这是写像这样:

<ul> 
    <li ng-repeat="track in tracks">{{track.title}}</li> 
</ul> 

我得到几个要点,但它们都是空的。换句话说{{track.title}}不存在?我测试过这是一个有效的属性。此外,我知道$scope.tracks正在填充,因为确实有列表项,但它们都是空的。

感谢您的帮助!

编辑:我做了一些关于ng-repeat的调查,并了解到它的更新如.push() ......应该仍然不能解释这种奇怪的行为,但它可能有助于识别问题。

+0

我怀疑这个问题与'ngRepeat'无关。尝试在'ngRepeat'之外写'{{tracks [0] .title}}来验证。标题是什么样的? – gkalpak

+0

适合我** http://jsfiddle.net/moogs/4pmpY/2/** –

+0

我发布了一个答案,但我还有一个问题。你只使用一个视图吗?曲目是否与搜索框显示在同一页面上? –

回答

1

这不会是最新的技术解释,所以我欣赏所有的修改。由于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; 
}); 

刚刚成立这里的服务得到您的client_id和组oauth_token。然后,路径就是您想要的任何终点,params就是您想要传递给SC的任何参数。