Вызов функции дротика при инициализации углового контроллера

Я пытаюсь вызвать функцию dart при инициализации контроллера AngularJS, но получаю ReferenceError: myFunction is not defined.

index.dart

import 'dart:js';

myDartFunction() {
  return 42;
}

main() {
  context['myFunction'] = (JsObject exchange) {
    exchange['output'] = myDartFunction();
  };
}

Мой html с AngularJS:

<!DOCTYPE html>
<html ng-app="MyApp">
<head lang="en">
    <meta charset="UTF-8">
    <title>My Title</title>
</head>
<body>
    <div ng-controller="MyCtrl">
        <p>{{var}}</p>
    </div>
    <script type="application/dart" src="index.dart"></script>
    <script type="application/javascript" src="../packages/browser/dart.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.js"></script>
    <script>
        angular.module("MyApp", []).controller('MyCtrl', function($scope) {
            var exchange = {};
            myFunction(exchange);
            $scope.var = exchange['output'];
        });
    </script>
</body>
</html>

Мне кажется, что context['myFunction'] еще не был установлен, когда контроллер инициализируется. Как я могу дождаться этого и инициализировать $scope.var?


person maiermic    schedule 04.10.2014    source источник


Ответы (2)


Я узнал, что можно использовать window.onload, который вызывается после того, как моя функция dart была экспортирована в JS. Затем я использую $scope.$apply, чтобы изменить переменную области видимости. .

angular.module("MyApp", []).controller('MyCtrl', function($scope) {
    window.onload = function () {
        $scope.$apply(function () {
            var exchange = {};
            myFunction(exchange);
            $scope.var = exchange['output'];
        });
    }
});
person maiermic    schedule 05.10.2014

Я бы предложил запустить событие из Dart после создания функции и выполнить код в JavaScript в качестве обработчика этого события.

person Günter Zöchbauer    schedule 04.10.2014
comment
Какое событие вы бы уволили? Какой код вы бы выполнили в обработчике событий? Где я могу прослушать событие, имея доступ к моей переменной angular? - person maiermic; 05.10.2014
comment
Вы можете просто вызвать dispatchEvent(new CustomEvent('dart-ready')); (не тестировалось, но насколько я помню, это должно выглядеть так). В JavaScript вы можете сделать что-то вроде document.addEventListener('dart-ready', doSomething, false); - person Günter Zöchbauer; 05.10.2014
comment
Хорошо, но как мне получить доступ к моей угловой переменной в doSomething? - person maiermic; 05.10.2014
comment
Вы делаете функцию Dart доступной для JavaScript (как вы сделали с myDartFunction), которая возвращает значение переменной Dart, к которой вы хотите получить доступ из JS. - person Günter Zöchbauer; 05.10.2014
comment
Возможно, есть какое-то заблуждение. Я хочу инициализировать переменную angular (var, используемую в <p>{{var}}</p>) результатом вызова функции dart (myDartFunction). Если я вызываю dispatchEvent(new CustomEvent('dart-ready')); после того, как context['myFunction'] был установлен, и слушаю свой код JavaScript с document.addEventListener('dart-ready', doSomething, false);, я могу вызвать myDartFunction через myFunction в doSomething, но я не знаю, как присвоить результат var, потому что я не знаю, как получить доступ к var в doSomething (вне углового). - person maiermic; 05.10.2014
comment
Если ваш обработчик событий doSomething является функцией вашего контроллера MyCtrl, это должно быть довольно просто. Я не знаю Angular.js и не могу сказать, связано ли это с какими-то трудностями. - person Günter Zöchbauer; 05.10.2014
comment
Это был тот намек, который мне был нужен. Я должен позвонить $apply. Типичная ошибка новичка. - person maiermic; 05.10.2014