2014-02-08 47 views
0

我遇到了與問here相同的問題,並且解決方案也起作用。但是在創建示波器的時候無法將我的頭包裹起來。如果在以下代碼中的$ modal指令中創建了新範圍,那麼爲什麼範圍在modal.html(view)和ModalInstanceCtrl中有所不同?何時使用angularUI Bootstrap Modal創建新範圍?

在下面的片的從同樣的問題代碼:

$scope.open = function() { 
    var modalInstance = $modal.open({ 
     templateUrl: 'modal.html', 
     controller: 'ModalInstanceCtrl' 
    }); 

(主要的問題是在modal.html的NG-模型=在同一範圍內對象作爲$範圍「文本」不是其控制器:ModalInstanceCtrl。)

我對範圍的理解是,rootcope首先由ng-app創建。然後新的範圍由創建新範圍的指令創建。

主要差異是,在路由,該結構類似於上述的代碼:

$routeProvider 
    .when('/', { 
     redirectTo: '/pages' 
    }) 
    .when('/food', { 
     templateUrl: 'food.html', 
     controller: 'foodController' 
    }) 
    .when('/play', { 
     templateUrl: 'play.html', 
     controller: 'playController' 
    }); 

儘管相似性,這裏在templateUrl(視圖)和控制器的範圍目的是相同的,那麼,爲什麼在最前一頁在templateUrl(視圖)和控制器是不同的代碼範圍?在引用的問題中,回答中的評論是由於嵌套控制器,我發現在第二段代碼中沒有嵌套控制器,而在第一段中存在嵌套。但是這並不能說明爲什麼在第一段代碼中,視圖和控制器中的作用域是不同的,何時創建新的作用域。

回答

3

在編寫角應用程序時重新定位WTF。當我發生這種情況時,我感覺到有一個「隱藏」範圍正在某處使用,我可能忘記了「在ng模型中使用點符號」規則。

在這種情況下,請查看html源代碼。您的modal.html內容位於<div class="modal-content" ng-transclude>之內。這綁定到一個新的從ModalInstanceCtrl範圍繼承的transcluded範圍。

當您鍵入輸入時,新的文本屬性被添加到transcluded作用域,因爲直接在作用域上分配原語不會查詢原型鏈。不參考ModalInstanceCtrl的範圍。

將原語分配給作用域上的對象確實會查閱原型鏈,因此使用點符號規則。這就是爲什麼你引用的文章SO與工作input.abc

這裏是一個great SO article on prototypical inheritance and angular scopes

+0

非常完整,翔實,準確的答案! –

+0

哦......所以在這裏,ng-transclude指令是創建新範圍的罪魁禍首。還有一件事我想清楚,ModalDemoCtrl的$範圍是否與ModalInstanceCtrl的$範圍相同? (在我提到的問題中) – Anubha

+0

不,他們是不同的。 –