У меня есть две директивы. Когда я изменяю данные в родительской области из области дочернего объекта, данные не изменяются. Вы можете протестировать, щелкнув один из элементов li.
http://plnkr.co/edit/7ewMokT2vTnLWBFEdm14?p=preview
HTML
<ez-select>
<ez-option title="option 1">
Option 1 inside
<input ng-model="x">{{x}}
</ez-option>
<ez-option title="option 2">
Option 2 inside
</ez-option>
</ez-select>
JAVASCRIPT
m.directive('ezSelect',function(){
return {
template:'<ul ng-transclude></ul><br>Selected: {{selected}}',
transclude:true,
link:function($scope){
$scope.selected=1
}
}
});
m.directive('ezOption',function(){
return {
template:'<li></li><div ng-show=selected ng-transclude class=body></div>',
link:function ($scope,iElement,iAttrs,controller,tanscludeFn){
iElement.find('li').html(iAttrs.title)
iElement.closest('ez-select').find('.body')
iElement.find('li').on('click',function(){
$scope.selected=false
$scope.$parent.selected=2
})
},
controller:function($scope){
$scope.selected=false
},
transclude:true
}
})
Проверьте эту рабочую демонстрацию: http://plnkr.co/edit/lRKhAHB9zmHKKrcdD6nO?p=preview.
Требуются две модификации.
Во-первых, как комментирует charlietfl, всегда используйте объект для совместного использования модели. Для подробного объяснения, проверьте эту замечательную статью: Понимание областей. В вашем примере я изменил selected
чтобы быть selected
data.selected
.
Во-вторых, поскольку событие onClick
выходит из цикла с угловым циклом, вам нужно использовать $scope.$apply
для запуска цикла $digest
вручную. Так:
$scope.$apply(function () {
$scope.selected=false;
$scope.$parent.data.selected=2;
});
Некоторые проблемы, связанные с вашим стилем кодирования:
scope
вместо $scope
в функции связиelement.on
используйте ng-click
[]
) вng-model
. Вы используете примитивы, и они не имеют наследования, как объект, поэтому вы потеряете двустороннее связывание в дочерних областях. В противном случае это та же проблема, что и ваш последний вопрос