2014-02-16 65 views
0

我有一個問題,即當使用角函數ng-repeat時,我的$ scope.todo列表總是返回一個未定義的值。如果我定義$ scope.todo,它可以很好地工作,但是當我使用下面的解決方案獲取結果並將其添加到變量中時,我會得到一個未定義的數據,它似乎有機會去檢索正確的值

I現在增加了一些更好的代碼來解釋我的問題。在看了下面的一些jsfiddles並嘗試這些解決方案之後,我開始認爲它與我的回調有關。

function TodoCtrl($scope) { 

    $scope.todos = []; 

    buildInitialList(function (result){ 
     console.log(result); //Logs defined after the undefined below 
     $scope.todos = result; 
    }); 

    console.log($scope.todos); //Logs undefined before the defined log above 
} 

function buildInitialList(callback){ 
    //Simulates call to db 
    setTimeout(function(){ 
    callback([{text: 'item 1', done: false}, 
     {text: 'item 2', done: false}]); 
},2000); 
} 

function fetch(url, callback) { 
    $.getJSON(url, function (data, status) { 
     callback(data); 
    }); 
} 
+1

數據庫中檢索到的我的價值觀有幾個語法錯誤是他們拼寫錯誤或實際代碼? –

+0

對不起,只是錯別字:( –

+0

你實際上從來沒有真正將結果賦值給你的範圍變量http://jsfiddle.net/973nW/ –

回答

0

拉我的頭髮和思考什麼是錯的我的JavaScript後,原來的問題實際上是內NG-重複

這是我的HTML看起來像

<ul class="unstyled"> 
     <li ng-repeat="todo in todos"> 
      <input type="checkbox" ng-model="todo.done"> 
      <span class="done-{{todo.done}}">{{todo.text}}</span> 
     </li> 
</ul> 

這工作得很好,當我已經定義的從一開始不過待辦事項的右側列表時,我不得不去到DB &檢索列表中的結果似乎從來沒有被應用到原來的$ scope.todos

我不得不使用$範圍。$應用功能,以確保當從他們實際應用到$範圍之後

buildInitialList(function (result){ 
    $scope.$apply(function(){ 
     console.log(result); 
     $scope.todos = result; 
    }); 
}); 
2

不應該這樣:

$scope.testList = buildInitialList(function (result){ 
    return result; 
    } 

是這樣的:

$scope.testList = buildInitialList(function (result){return result;}); 

而且buildInitialList函數沒有返回任何值。根據您的示例代碼可能是這樣的:

function buildInitialList(callback){ 
    var result = doWorkAndGetResult(); 
    callback(result); 
    //missing return value... 
    return result; /*maybe?*/ 
} 

這是一個完全正常的jsfiddle演示:

http://jsfiddle.net/f9ee4/1/

+0

對不起,如果我做 $ scope.testList = buildInitialList(function(結果){ 控制檯。日誌(結果); 返回結果; }); 我得到正確的結果記錄到控制檯,所以這兩個函數似乎工作正常,只是沒有被調用在正確的時間 –

+0

@MartyCochrane它在我的最終工作。您的功能沒有返回,這是/是問題。 – Dalorzo

+0

@MartyCochrane,我加了一個JSFiddle。 – Dalorzo

0

你從來沒有真正賦予您的結果範圍變量。你的回調被調用,但你的回調的返回值不是分配給你的範圍屬性的東西。

通過使用回調,我假設您在該全局函數中有某種異步調用。如果在那裏沒有異步調用,那麼你應該從buildInitialList返回值,而不使用回調。

這裏是一個可行的小提琴: http://jsfiddle.net/973nW/

function MyCtrl($scope) { 
    buildInitialList(function (result){ 
     $scope.name = result; 
    }); 
} 

邊注:使用全局函數是不是一個好主意,你可能要考慮把你的函數到服務。我使用的HTML