2014-09-05 75 views
1

嗨我有一些嵌套的菜單,我試圖從父級更改子範圍的顏色,但它不工作。這是簡化的代碼。AngularJS父範圍沒有更新子範圍

.directive('botMenuClick', function() { 
    return { 
     link: function(scope,ele,attrs){ 
      ele.bind('click', function(){ 
       if(ele.attr('homeBtn')==='true'){ 
        scope.$parent.setDisplay = {'color': '#fff'} // this applies to all children but not the one which is set in else condition 
       }else{ 
        scope.setDisplay = {'color': 'green'} 
       } 
       scope.$apply(); 
      }); 
     } 
    } 
}) 

所以,一旦我得到的其他條件和菜單顏色變爲綠色,然後不管它不會變成白色,即使我走在上面homeBtn條件。

+1

你是否試圖從父作用域訪問子作用域或子作用域的父作用域? – Prasad 2014-09-05 18:23:56

+0

我從自己的範圍設置setDisplay樣式,然後從父級更改後者。 – alflashy 2014-09-06 15:13:15

回答

2

這是因爲這就是原型繼承的工作原理。如果一個子對象設置一個與原型屬性同名的屬性,那麼這個子對象本身實際上是在創建一個隱藏父屬性的新屬性。從this mdn article

「將屬性設置爲對象將創建自己的屬性。獲取和設置行爲規則的唯一例外是當存在具有getter或setter的繼承屬性時。

我的假設是,UI元素綁定到子範圍屬性,該子元素屬性在else條件設置之前不存在,所以一直到查找原型鏈的值爲setDisplay。只要else條件觸發setDisplay在子範圍上設置,隱藏其餘永恆的原型值。

+0

但setDisplay是HTML已經設置在NG-風格類似這樣的

{{bottomSubMenu.subMenuLabel}}
alflashy 2014-09-06 15:10:04

+0

綁定到HTML中的範圍值未進行任何設置。通過設置HTML綁定,'$ compile'服務可以知道'scope'上的哪些JavaScript屬性綁定到。所有屬性的聲明和修改都發生在JavaScript中。 – bmceldowney 2014-09-06 17:02:36

+0

請閱讀此問題以獲取更多上下文:http://stackoverflow.com/questions/16972976/angular-js-propagate-child-scope-variable-changes-to-parent-scope?rq=1 – bmceldowney 2014-09-06 17:20:00