2015-02-09 90 views
0

分配我有一個Angular指令,其行爲像ng-include,只是帶有選項卡。 所以它有一個分層範圍(scope: true)。角 - 從指令

獲取和設置父作用域的變量值我使用$解析:

var modelFn = $parse(attrs.ngModel);

獲得優良工程這樣var value = modelFn(scope)甚至scope.$eval(attrs.ngModel), 但分配父範圍不會改變的價值,它實際上創建在當前範圍的變量:

modelFn.assign(scope, { ... });

這是令人沮喪的,任何幫助嗎? 在此先感謝!

更新: 下面是一個例子

HTML:

<myDirective ng-model="myData"></myDirective>

指令:

{ 
replace: false, 
scope: true, 
template: '<button ng-click="changeData()"></button><div ng-include="templateUrl"></div>' 
link: function(scope, element, attrs){ 
var modelFn = $parse(attrs.ngModel); 
var value = modelFn(scope); 
scope.templateUrl = data.replace('a', 'b'); 
scope.changeData = function(){ 


// Problem is here, assignment is on the current scope and not parent (or parent's parent and etc..) 
modelFn.assign(scope, {name: 'new Value'}); 
} 
} 
} 
+0

爲什麼你就不能使用'$範圍父'?爲什麼'$ parse'? – Claies 2015-02-09 22:24:03

+0

你應該展示更多代碼來解釋你正在嘗試做什麼。我不清楚爲什麼以及如何使用ngModel – 2015-02-09 22:28:25

+0

它並不總是直接的父母.. 我不能顯示更多,老闆不允許,反正這是解釋問題 – 2015-02-09 22:34:11

回答

0

在JavaScript對象都有原型。

當您指定scope: true時,您告訴該指令具有從父範圍原型繼承的範圍。

這意味着你得到一個特殊的鏈接到父範圍(原型),在那裏你可以訪問所有的值和對象,所有的方法,直到...你試圖爲這些值寫東西,對象和方法。

你可以看到原型有後備,當你的對象上沒有任何值/對象/方法時,它會嘗試着看原型。 但是,當你想設置一個值/對象/方法,你實際上將它設置在你的對象上,而不是原型,所以你的父範圍值/對象/方法會改變。

的代碼位來說明:

https://gist.github.com/bcharp/712d6d9bfaf55b3c5d81

一個有趣的事實知道的是,如果你改變通過原型訪問對象的價值之一,這將是在原型對象中的變化。

因此,對於你目前的麻煩,你可以簡單地改變你的直接訪問值說通過$scope.properties = {title:'My title'};$scope.title = "My title";和訪問它通過$scope.properties.title當你改變它的對象內部(指令繼承範圍),這將是他的原型改變(父範圍)。

我希望它很清楚。

+0

所以這意味着如果任何人想使用我的指令,他不能直接將變量放在作用域上,就像這個'$ scope.myData'一樣(並且在html put 「ng-model ='myData'」),他需要像這樣放入一個對象:'$ scope.vm.myData'(「ng-model ='vm.myData'」)。 我想避免開發人員這樣一個奇怪的要求... – 2015-02-10 05:32:52

+0

那麼在這種情況下使用隔離範圍,而不是繼承一個,https://docs.angularjs.org/guide/directive#isolating-the-scope-of -a-directive – 2015-02-10 09:40:57

0

爲什麼不使用雙向綁定將變量傳遞給指令?下面將結合myParam這樣,當你在指令改變它也將在呼叫範圍發生變化:

.directive('myDirective', function() { 
    return { 
    scope: { 
     myParam: '=' 
    }, 
    templateUrl: 'template.html', 
    controlle: MyCtrl 

... etc... 

}; 
}) 

HTML:

<my-directive my-param = "foo"><my-directive/> 
+0

這是在angular中創建一個獨立的作用域..對ng-include沒有好處,因爲表達式不會從父級的作用域知道任何東西 – 2015-02-09 22:55:50