2014-06-29 31 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的任何參數。