2013-08-27 103 views
3

我一直在撓頭,因爲這可能是問題,請原諒我缺乏JavaScript專業知識。AngularJS服務變量參考

我有一個Angular應用程序,除其他外,有一個用戶將工作的項目隊列。我有一個管理此隊列的服務(當前項目,移動,完成等)。我創建的控制器從服務器獲取當前隊列項目的詳細信息,然後顯示它們。

我遇到的問題是服務正在正確移動對象的隊列,將當前項目設置爲當前索引處的數組項目。但是,Controller從不會看到當前的項目更改。

這裏是一個基本的例子來解釋。一個工作示例是http://jsfiddle.net/Surefire_gf/pjMrh/2/,您需要查看控制檯才能看到輸出。

// ... service code... 
var items = []; 
var currentItem; 
var currentIndex; 
... 
var moveNext = function() { 
    currentIndex = currentIndex + 1; 
    currentItem = items[currentIndex]; 
}; 

// ... controller code ... 
var skip = function() { 
    service.moveNext(); 
    fetchData(service.currentItem); //THIS NEVER CHANGES, ALWAYS UNDEFINED 
}; 

將當前項目變量設置爲數組中的某個位置可以在服務中看到,但從不是控制器。但是,如果我做一個angular.extend而不是直接引用數組,它就可以工作。有誰知道可能會發生什麼?

回答

2

這是因爲服務對象不會從您的moveNext函數中更新。

試試這個:

// service code... 
var service = { 
    currentItem: null 
}; 

// ....... 

service.moveNext = function() { 
    currentIndex = currentIndex + 1; 
    if (currentIndex >= items.length) { 
     currentIndex = 0; 
    } 
    service.currentItem = items[currentIndex]; 
// ^^^^^^^^ this is what was wrong... 
}; 

return service; 

這是你的提琴:http://jsfiddle.net/pjMrh/3/

+0

我在原來的小提琴,該值被設置在第29行,'CURRENTITEM =項目[CURRENTINDEX]'請原諒我的無知的JavaScript,但爲什麼沒有工作? – user2175281

+0

@ user2175281 - 在你原來的小提琴中,'currentItem'只是一個局部變量;它不是服務的一部分(即使您將*值賦給服務對象)。 –

+0

啊,我明白了,點擊了。謝謝,完美地工作! – user2175281

0

你有一個變量範圍的問題,使得函數執行範圍結束後的變量currentItem得到釋放。將currentItem指定爲this將解決此問題。

var moveNext = function() { 
    ... 
    this.currentItem = items[currentIndex]; 
    ... 
}; 
return { 
    currentItem: this.currentItem, 
    moveNext: moveNext 
}; 

DEMO