У меня есть приложение, в котором у меня есть 2 выпадающих списка, одно для штата и другое для города, и директива, в которой есть макет значений, ни к чему не привязанных.
Мне нужно установить связь между директивой и этими двумя раскрывающимися списками.
(Прежде чем я начну, я хотел бы отдать должное Джонатану Райту: Angular JS — Мапквест)
<select ui-select2="select2Options" ng-model="LocationModel.State">
<option value=""></option>
<option ng-repeat="state in states" value="{{state.id}}">{{state.name}}</option>
</select>
<select ui-select2="select2Options" ng-model="LocationModel.City">
<option value=""></option>
<option ng-repeat="city in cities" value="{{city.id}}">{{city.name}}</option>
</select>
Вот мой шаблон директивы html:
<map class="mapper" height="400" width="700"></map>
и вот директива angular (это не работает)
mapapp.app.directive('map', function (logger) {
var directiveDefinitionObject = {
restrict: 'E',
template: '<div id="map"></div>',
link: function link(scope, element, attrs)
{
var map_height = attrs['height'] || 400;
var map_width = attrs['width'] || 400;
$('#map').css('width', map_width).css('height', map_height);
//somehow get the scope values to show up here every time
//the dropdown gets selected
var city = scope.LocationModel.City;
var state = scope.LocationModel.State;
/* do mapping logic here */
}
};
});
Как вы можете видеть суть того, что я пытаюсь сделать, я пытаюсь заставить мою директиву распознавать раскрывающиеся списки.
Я думаю, что моя директива должна иметь свою собственную ng-модель и что значение ng-модели должно отражать два раскрывающихся списка модели, но я не совсем уверен, как это сделать. Я огляделся и не смог найти ничего, что могло бы мне помочь.
[Редактировать — 28 января 2014 г. — 19:13 по восточному времени]
Следуя совету Далорзо, я создал следующие скрипачи:
Вот jsfiddle $watch, работающий в контроллере:
Однако при удалении этих часов и попытке использовать $watch, расположенный в директиве, это не сработает.
[Изменить — 28 января 2014 г., 22:52 по восточному времени]
Разобрался. Поскольку я дважды вызывал LocationCtrl, я думал, что модель области действия будет общей для обоих html-элементов. По-видимому, это не так; что происходит, так это то, что я создаю еще один экземпляр модели области, где область действия будет обновлена для раскрывающегося списка, но не для директивы. Совместно используя их в одной области видимости, мы видим, что значение «LocationModel.State» было изменено.
Я нашел находчивую ссылку о том, как заставить один контроллер общаться с другим:
http://onehungrymind.com/angularjs-связь-между-контроллерами/