2013-08-17 45 views
2

我一直在嘗試使用Angular幾個星期,並且有點困擾我不明白$ scope服務使用的魔法。我已經成功編寫了使用$ scope服務更新模型/視圖的控制器,並且我已經能夠編寫自己的指令來執行相同的操作。

太神奇了!我只是不明白$ scope服務引發了什麼。當我創建類似下面的內容時,當我將任務分配給$ scope.newproperty時,實際發生了什麼?我一直無法找到任何特定於$ scope服務的文檔。

module.controller("menu_ctrl",['$scope','$http',function($scope,$http){ 
    $scope.newproperty = "Bound to model!" //magic! 
}]); 

而且,當我一個指令中創建一個新的連接功能(如下所示),它是如何突然之間我可以用一個變量訪問範圍有多大?我認爲使用$ scope或$ apply服務會有一些魔力,但我只是猜測。任何幫助在這裏將不勝感激。謝謝!

srvcs.directive('directiv', ['$http',function($http) { 
    var returnObj = { 
    link: function linkfn(scopeVar, instance, attr){ 
     console.log(scopeVar); 
     scopeVar.newproperty = "Also bound to model!" //more magic! 
     ... 
     ... 
     } 
    }; 
    return returnObj; 
}]); 
+0

你讀過http://docs.angularjs.org/guide/scope? –

+0

是的,我已閱讀文檔。我理解範圍的概念,我對實現細節感興趣。例如。 $ scope是一個範圍對象的別名還是它爲適當的範圍對象提供了getter/setter方法? –

回答

5

$scope不是服務本身;它只是應用程序根範圍的子範圍。所以你應該看看$rootScope service文檔。

從技術上講,範圍是從$rootScope原型繼承的對象,它是使用$new方法創建的。由於它是一個對象,因此只需執行$scope.property = value;即可在其上創建新的屬性。引擎蓋下沒有getter/setter方法。要更好地理解它,您應該在Angular源代碼中查找function $RootScopeProvider()

而且由於範圍只是一個對象,因此您可以像在控制器中一樣在指令中使用link函數訪問它。沒有魔法需要。 :)

關於$apply,它不是服務,但$rootScope服務的方法。它所做的只是觸發一個摘要循環,以便Angular處理當前範圍的觀察者及其子項。

最後,你可能有興趣查看understanding Angular scopes這個帖子,如果你還沒有的話。 :)

+0

謝謝!很有幫助。 –

相關問題