2015-02-09 2 views
0

У меня есть директива Angular, которая ведет себя как ng-include, только с вкладками. (scope: true).угловой - назначение из директивы

Чтобы получить и значение переменного набора родительского осциллографа я использую $ разобрано:

var modelFn = $parse(attrs.ngModel);

получение отлично работает, как это var value = modelFn(scope) даже scope.$eval(attrs.ngModel), но присвоение не изменяет значение на родительской области, это фактически создает переменную на текущей области:

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

Это расстраивает, любая помощь? Спасибо заранее!

Update: Вот пример

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

+0

Вы должны показать больше кода, чтобы объяснить, что вы пытаетесь сделать. Мне непонятно, почему и как вы используете 'ngModel' –

+0

Это не всегда прямой родитель. Я не могу показать больше, босс не позволяет, так или иначе это объясняет проблему –

ответ

0

В JavaScript объект есть прототип.

Когда вы укажете scope: true, вы указали директиве, что у нее есть прототип, унаследованный от родительской области.

Это означает, что у вас есть специальная ссылка на родительскую область (прототип), где вы можете получить доступ ко всем значениям и объектам, и все это методы, пока ... вы не попытаетесь написать материал для этих значений , объекты и методы.

Вы можете видеть, что прототип имеет резервную копию, когда на вашем объекте нет значения/объекта/метода, он попытается взглянуть на прототип. Но когда вы хотите установить значение/объект/метод, вы фактически устанавливаете его на свой объект, а не прототип, и поэтому изменяются значения родительской области/объекты/методы.

Немного кода для иллюстрации:

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

Интересный факт, чтобы знать, что если вы измените один из стоимости доступа объекта через прототип, это будет изменение объекта-прототипа ,

Так что для текущей проблемы, вы можете просто изменить ваше прямое значение доступа сказать $scope.title = "My title"; по $scope.properties = {title:'My title'}; и получить доступ к нему через $scope.properties.title при изменении его внутри объекта (директива унаследовала масштаб), то это будет изменение в его прототипе (родительскую сфера).

Надеюсь, это ясно.

+0

Итак, это означает, что если кто-то хочет использовать мою директиву, он не может просто поместить переменную в область непосредственно как этот '$ scope.myData' (и в html put «ng-model = 'myData»), ему нужно вставить такой объект: '$ scope.vm.myData' (« ng-model =' vm.myData »). Я хотел избежать такого необычного требования от разработчика ... –

+0

Ну в этом случае используйте изолированную область, а не наследуемую, https://docs.angularjs.org/guide/directive#isolating-the-scope-of -a-директива –

0

Почему бы вам просто не передать переменную в директиву с использованием двусторонней привязки?Ниже будет связывать MyParam так, что при изменении его в директиве он также будет меняться в вызывающей сфере:

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

... etc... 

}; 
}) 

HTML:.

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

Это создает изолированную область видимости в угловом ... не подходит для ng-include, потому что выражения ничего не знают из областей родителя –

Смежные вопросы