Я использую пользовательские модули, которые я пытаюсь не редактировать, чтобы обновления были приятными и легкими.
Я пытаюсь разрешить пользователю просматривать файл CSV в локальной файловой системе, анализировать его и отображать в динамической таблице. Для этого я использую PapaParse
, ui.grid
и angularFileUpload
.
Проблема, с которой я сталкиваюсь, заключается в том, что все они работают на разных уровнях иерархии.
angularFileUpload - это легко - он вызывает функцию в моем контроллере (используя синтаксис controllerAs). Затем эта функция запускает функцию PapaParse для преобразования CSV файла в объект JSON (все работает до сих пор).
Проблема заключается в том, что ui.grid
работает с объектом $ scope, поскольку он является директивой атрибута и не поддерживает наблюдателей для мониторинга изменений в переменной (вам нужно вызвать функцию обновления данных для повторной привязки данных),
Поэтому вопрос заключается в том, что внутри моего контроллера правильный/рекомендуемый способ связи с внешней директивой без редактирования директивы для прослушивания сообщений.
ui.grid
должен связываться с изменениями связанных с ним данных. Поэтому вы должны изменить только локальный масштаб $, к которому привязана сетка, и все работает нормально.
Как вы упомянули, директивы не слушают сообщения, но это также не то, как работает Angular. Угловые силы привязки данных, поэтому, привязывая поле к директиве, компонент должен позаботиться о обновлении своего представления, как только вы измените модель, с которой вы ее связали.
К сожалению, ui.grid
не придерживается этого соглашения. Поэтому вы должны отображать сетку, как только пользовательские данные есть (внутри функции, вызываемой после открытия файла или через $watch
). Это можно сделать, например, через ngIf
, где ngIf
директива загружается только тогда, когда поле истинно. Когда пользователь переключается между двумя CSV, вы можете установить значение false, загрузить данные в своей модели и снова установить его в true. Убедитесь, что между часами есть один цикл дайджеста (например, через $timeout
), чтобы ваше изменение повлияло на пользовательский интерфейс.
ui.grid
если вы делаете это.