2014-02-21 60 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