Не удается получить доступ к угловой переменной из функции, вызываемой диалоговым окном угловой материал

У меня есть простой угловой контроллер, в котором:

var vm = this;
var selectedAppId = "";

На моей веб-странице последняя переменная используется следующим образом:

                    <select id="selectapp" ng-model="vm.selectedAppId" ng-change="vm.updateCurrentAppPages()">
                        <option ng-repeat="app in vm.apps" value="{{ app.appId }}">
                            My {{ app.appName }} App
                        </option>
                    </select>

Во время нормальной работы страницы vm.переменная selectedAppId действует как ожидалось. Но вот в чем проблема:

У меня есть диалоговое окно угловой материал, которое позволяет указать имя файла. Когда» сохранить » нажата, мне нужно получить доступ к значению vm.selectedAppId. К сожалению, в этом контексте он последовательно устанавливается на пустую строку. Я предполагаю, что это масштабный вопрос, но я не знаю, как его решить.

Итак, вот мой вопрос: из контекста диалогового окна угловой материал и его вспомогательных функций, как я получаю значение переменной уровня контроллера?

Роберт У.

Обновление
Вот еще код:

        vm.addNewPage = function (ev) {
            setIsBusy(true);

            $mdDialog.show({
                controller: editorController,
                template:
                    '<md-dialog aria-label="Get Filename">' +
                    '<md-toolbar>' +
                    '<div class="md-toolbar-tools navbar-default">' +
                    '<md-title>Add New Page - ' + $('select#selectapp option:selected').html() + '</md-title>' +
                    '<span flex></span>' +
                    '<md-button class="md-icon-button" ng-click="cancelDialog()">' +
                    '<md-icon md-svg-src="/images/ic_close_24px.svg" aria-label="Close dialog"></md-icon>' +
                    '</md-button>' +
                    '</div>' +
                    '</md-toolbar>' +
                    '<md-dialog-content>' +
                    '<md-content>' +
                    '<div class="fileNameIntro">Filename</div>' +
                    '<md-input-container class="inputFilenameContainer">' +
                    '<input id="inputFilename" ng-model="vm.fileName" ng-init="setFocus('inputFilename')" required md-maxlength="100" ng-change="filenameChanged(vm.fileName)" class="inputFilename" aria-label="Filename Input">' +
                    '</md-input-container>' +
                    '</md-content>' +
                    '</md-dialog-content>' +
                    '<md-dialog-actions>' +
                    '    <md-button ng-click="cancelDialog()" class="md-primary">' +
                    '        Cancel' +
                    '    </md-button>' +
                    '    <md-button id="saveFilename" ng-click="saveFilename(vm.fileName, vm.selectedAppId)" class="md-primary" disabled="true">' +
                    '        Save' +
                    '    </md-button>' +
                    '</md-dialog-actions>' +
                    '</md-dialog>',
                parent: angular.element(document.body),
                targetEvent: ev,
                clickOutsideToClose: false
            });

            vm.isDisabled = false;
            setIsBusy(false);
        };

        $scope.saveFilename = function (filename, appId) {
            debugger;
            filename = filename.replace(/.[^/.]+$/, "");
            var currentTime = new Date(new Date().getTime() + new Date().getTimezoneOffset() * 60000);
            debugger
            vm.appPages.push({
                "appId": appId,
                "filename": filename + ".html",
                "content": filename + " Page Sample Content",
                "createDateTimeUtc": currentTime,
                "updateDateTimeUtc": currentTime
            });

            vm.updateCurrentAppPages();

            $mdDialog.hide();
        }

filename содержит значение, но appId всегда является нулевой строкой. Почему?

2 ответа

  1. Если вы используете отдельный контроллер, то передайте $scope этому. В противном случае оберните код в поле материал с помощью функции $timeout.

  2. Ответом оказалась необходимость добавления специального значения параметра scope:

                $mdDialog.show({
                    controller: editorController,
                    scope: $scope.$new(),
                    template: ...