Angular включенная директива с двусторонней привязкой к контроллеру не обновляется

Я использую этот https://github.com/blackgate/bg-splitter для создания горизонтальных и вертикальные разделители стекла. (Полный код находится в созданном мной plunkr)

С тех пор, как я начал его использовать, у меня возникла проблема с двусторонней привязкой контроллера и директивы.

Директива имеет две переменные, listData и selectedOption:

template: '<select ng-model="selectedOption" ng-options="l.name for l in listData" class="form-control"></select>',
    scope: {
        listData: "=",
        selectedOption: "="
    },

Контроллер имеет эти переменные и имеет функцию наблюдения за изменениями:

$scope.listdata = [{id : 1, name : "listitem1"},{id : 2, name : "listitem2"},{id : 3, name : "listitem3"}];

$scope.selectedOption = null;

$scope.$watch('selectedOption', function() {
        console.log('updating selected choice');
        console.log($scope.selectedOption);
}, true);

И директива используется как:

<dropdown list-data="listdata" selected-option="listItem"></dropdown>

Без paneSplitter выпадающее меню работает. По какой-то причине, когда связанная переменная обновляется в раскрывающемся списке, она не обновляется в контроллере. Вероятно, это проблема масштаба, но я не могу понять это сам. Любая помощь приветствуется. См. следующий plunkr с полным кодом:

http://plnkr.co/edit/UnJaPV8LYm3unILEU3Lq


person Daan van Hulst    schedule 18.07.2014    source источник
comment
Это похоже на проблему с прототипным наследованием, взгляните на stackoverflow.com/a/14049482/957731.   -  person ivarni    schedule 18.07.2014
comment
Хм. Но и директива transcluded, и директива раскрывающегося списка имеют изолированную область действия с областью действия контроллеров в качестве родителя, верно? Посмотрим, смогу ли я проверить это.   -  person Daan van Hulst    schedule 18.07.2014
comment
Я пытался протестировать это в вашем плункере, но там было много кода и у меня не хватило терпения, так что это может быть другая проблема. Думаю, все же стоит изучить. Этот связанный ответ очень хорошо читается, несмотря ни на что.   -  person ivarni    schedule 18.07.2014


Ответы (1)


Помните известную цитату: «Если вы не используете .(точку) в своих моделях, вы делаете это неправильно?» Если вы поменяете часы на это:

$scope.$watch('data.listItem', function() {
        console.log('updating selected choice');
        console.log($scope.data.listItem);
}, true);

и изменить Html на этот

<dropdown list-data="listdata" selected-option="data.listItem"></dropdown>

Вот плункер

person Edminsson    schedule 18.07.2014
comment
Потрясающий. Я только что посмотрел видео, откуда взята эта цитата, и я не думаю, что когда-нибудь ее забуду ;). Угадайте, узнав много нового, всегда разумно в какой-то момент вернуться к основам. Спасибо! - person Daan van Hulst; 18.07.2014
comment
Спасибо! Это также решило мою проблему. Кому-нибудь кажется странным, что нам нужно добавлять элементы как вложенные объекты? - person Chris; 06.03.2015