2014-02-21 153 views
1

我是Angular的新手,我使用的是Firebase作爲我的後端。我希望有人可以調試這個問題。當我第一次訪問我的頁面www.mywebsite.com/#defaultHash數據不會加載到DOM中,它會在訪問另一個散列鏈接並返回後執行。Angular如何不在範圍內更新?

我的控制器是這樣的:

/* initialize data */ 

var fb = new Firebase('https://asdf.firebaseio.com/'); 

/* set data to automatically update on change */ 

fb.on('value', function(snapshot) { 

    var data = snapshot.val(); 
    $scope.propertyConfiguration = data.products; 
    console.log($scope.propertyConfiguration); 
    console.log("Data retrieved"); 

}); 

/* save data on button submit */ 

$scope.saveConfigs = function(){ 

    var setFBref = new Firebase('https://asdf.firebaseio.com/products'); 
    setFBref.update($scope.propertyConfiguration); 
    console.log("configurations saved!"); 

}; 

我有3條散列路線說「共享」,「註冊」和「家」與otherwise.redirectTo設置爲「共享」(他們都使用這個控制器)以下是發生的錯誤:(所有「鏈接」都是href =「#hashWhereever」)

1)轉到website.com/#Shared或者只是刷新。控制檯記錄$ scope.propertyConfiguration和「Data Retrieved」。 DOM什麼都沒顯示。

2)點擊到website.com/#Registration,控制檯正確記錄$ scope數據,DOM正確加載。

3)回到website.com/#Shared,控制檯正確記錄$範圍數據,但這次DOM正確加載。

4)刷新當前正確裝入website.com/#Shared。 DOM元素消失。

因爲$ scope.data是在所有情況下正確的這裏,應該沒有棱角確保DOM反映了模型是否正確?爲什麼只有當我從另一個鏈接點擊頁面時DOM才能正確加載。

我可以通過添加window.location.hash =「共享」,但它拋出一個巨大的錯誤的量在控制檯「修復」它。

FIXED:(八九不離十)

功能$ $範圍適用於()強制與模型同步的視圖。我會自己回答這個問題並關閉它,但我仍然想知道爲什麼視圖在正確賦值給$ scope的時候無法正確加載。如果Angular的「髒檢查」檢查模型是否有可能發生變化,是否將值賦給$ scope overqualify?

回答

2

Angular無法知道您已將值賦給$ scope.variable。這裏沒有魔法。當你運行一個指令(ng-click/ng-submit)或Angular內部函數時,它們都會調用$ apply()並觸發一個摘要(檢查髒標誌和更新例程)。

比$ apply更安全的方法是使用$ timeout。目前,如果您在Firebase中調用寫入操作,它可以同步觸發事件偵聽器(child_added,child_changed,value等)。這可能會導致您在$ apply範圍內調用$ apply。如果你這樣做,就會拋出一個錯誤。 $超過這個。

了多一點的消化和$超時的話題見this SO Question

This doc in the Angular Developer Guide covers how compile works;非常棒的背景閱讀任何嚴肅的角度開發。

另外,還可以通過使用official Firebase bindings for Angular,已經採取了所有這些實施細節考慮節省自己的能量一個很好的協議。

模糊相關注意:在不久的將來,Angular將能夠利用Object.observe magic來處理這些更新。

+0

我看到,我對Angular的檢查工作方式的具體細節並不太清楚。感謝您的解釋,鏈接和多種解決方案!(包括未來的!) – user2483724

+0

謝謝!我用鏈接到開發指南進行編譯更新了我的答案;如果你想認真對待Angular,這是一個非常有趣的閱讀。乾杯。 – Kato

+0

非常感謝:) – user2483724