Как получить доступ к полям API изолированной области при работе с синтаксисом «Controller As»?

0

У меня есть код, который позволяет выбрать место с карт Google.

Когда вы выбираете место, оно показывает, что вы выбрали, и его LAT/LON:

Изображение 174551

Вы можете увидеть это здесь

Но этот код не использует controller as синтаксиса.

Поэтому я изменил его:

  • Изменение контроллера:

Изображение 174551

  • Изменение Html:

Изображение 174551

  • Изменение директивы:

Изображение 174551

Вот НОВЫЙ код

Но теперь, когда я выбираю место - он не обновляет значения.

Вопрос

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

scope: {
        details: '=',
        ngAutocomplete: '=',
        options: '=',
        lt:'=',
        ln:'=',
      }

(Когда я перехожу к controller as)

Я имею в виду - не следует ли использовать controller (не scope) в:

link: function(scope, element, attrs, controller) ??

Что мне не хватает?

Если они скажут, что теперь ("контроллер как" синтаксис) контроллер является нашей моделью viewModel, поэтому я не вижу ничего плохого в использовании параметра контроллера и доступа:

controller.lt = ...;
controller.ln = ...;

И я, очевидно, ошибаюсь здесь...

  • 0
    Вы пропустили эту scope ссылок, но используете controller
  • 0
    @Grundy Гранди, я не понимаю твою точку зрения. Можешь уточнить?
Показать ещё 6 комментариев
Теги:

2 ответа

2
Лучший ответ

Кажется, вы смешиваете несколько концепций, потому что пытаетесь использовать один и тот же контроллер как в своей директиве, так и вне ее.

Даже если вы используете controller As вне вашей директивы, реализация внутри вашей директивы должна оставаться неизменной. Все дело в том, что директива не должна волновать, что происходит за ее пределами. Опция scope: {} позволяет вам указать директиву, какие значения нужно разместить в своей собственной области, на основе предоставленных значений атрибутов.

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

Рабочий plnkr: http://plnkr.co/edit/xyTX95JA2biYJmWPKxzZ?p=preview

Замечание: вам следует избегать префикса ваших компонентов с помощью ng. Префикс ng предназначен для компонентов, которые встроены в Angular, и вы должны использовать свой собственный префикс.

  • 0
    Я думал, что NG больше не касается области видимости, и теперь viewmodel - это new Controller() функция new Controller() . И поэтому я подумал, что директива должна иметь доступ к этому INSTANCE new Controller() .... нет?
  • 1
    @RoyiNamir Нет, директива не должна иметь прямого доступа к контроллеру за ее пределами. Директива имеет свою сферу применения. Вот почему опция называется scope .
Показать ещё 3 комментария
0

В итоге я использовал $ scope. $ Watch();

$scope.$watch(function() {
  return vm.location_result;
}, function(location) {
    if (location) {
       // do something
    }
});

Пример скрипта: http://jsfiddle.net/n3ztwucL/

GitHub Gist: https://gist.github.com/robrothedev/46e1b2a2470b1f8687ad

Ещё вопросы

Сообщество Overcoder
Наверх
Меню