Nano Hash - криптовалюты, майнинг, программирование

Область действия в HTTP-запросе TypeScript/angularJS GET

Я новичок в typescript и angular.js, и я борюсь с http-запросом на получение. Я использую DefinitelyTyped для определений типов angular.

Мой код контроллера выглядит так:

module game.Controller {
    'use strict';

    export interface IGameScope extends ng.IScope {
        vm: GameCtrl;
    }

    export class GameCtrl {

        private bonus: any;
        private http: any;

        constructor($scope: IGameScope, $http: ng.IHttpService, $location: ng.ILocationService) { 
            $scope.vm = this;
            this.http = $http;
        }

        doBet() {
            this.http.get('http://localhost:9000/db').success(function(data: any, status: any) { 
                    this.bonus = data;
                }
            );
        }
    }

}

а мой взгляд такой:

<button ng-click="vm.doBet()">bet</button>
<div><span>bonus: {{ vm.bonus }}</span></div>

привязка модели просмотра работает нормально, когда я меняю бонусную переменную без http-запроса. Но когда я пытаюсь обновить переменную бонуса в функции успеха запроса на получение, я получаю следующую ошибку:

TypeError: Cannot set property 'bonus' of undefined

Как я могу обновить переменные в функции успеха?

Я также был бы признателен за любое предложение, если есть лучший/более чистый способ или практика обновления данных по запросам.


Ответы:


1

Это легко сделать с помощью лямбда-выражения TypeScript:

doBet() {
    this.http.get('http://localhost:9000/db').success(
        (data, status) => this.bonus = data
    );
}
15.08.2013
  • У вас есть еще пояснения по этой теме? Например. а почему мы должны использовать здесь лямбда-выражение? 04.07.2014
  • в обычном js у вас было бы, например. this.http.get('url').success(function(data, status) { ... });, поэтому this не отображается в функции успеха. лямба-выражение, как показано выше, автоматически компилируется в var _this = this; this.http.get('url').success(function(data, status) { _this.member = "something"; });, поэтому this становится видимым в области видимости через вспомогательную переменную _this. надеюсь, это поможет. 04.07.2014

  • 2

    this в this.bonus = data; на самом деле относится к функции обратного вызова внутри success.

    Вместо этого вы можете сделать так: $scope.vm.bonus = data;

    15.08.2013
  • это не работает, так как $scope виден только в конструкторе, а не в функции doBet(). 15.08.2013
  • @ 3x14159265 Переместите doBet() в свой конструктор и объявите его как метод для $scope: $scope.doBet = function() { ... }; или просто передайте $scope в doBet(). 15.08.2013
  • @ 3x14159265 Из двух вариантов я бы предпочел переместить doBet внутрь контроллера и объявить его в области. 15.08.2013

  • 3

    Вы можете поместить метод в конструктор, чтобы получить доступ к $scope следующим образом:

    constructor($scope: IGameScope, $http: ng.IHttpService, $location: ng.ILocationService) {
        $scope.vm = this;
        this.http = $http;
    
        $scope.doBet = function() {
            this.http.get('http://localhost:9000/db').success(function (data: any, status: any) {
                $scope.bonus = data;
            });
        }
    }
    

    Вот руководство по использованию AngularJS с Typescript.

    15.08.2013
  • спасибо, я уже прочитал этот урок. Но действительно ли лучше всего определять все функции области действия в контроллере? кроме того, я привязываю переменную $scope.vm к моему экземпляру контроллера, чтобы исключить необходимость привязки каждой отдельной переменной области действия к моим переменным контроллера. так что ИМХО в этом случае не было бы улучшения при использовании привязки $scope.vm = this;. 15.08.2013
  • @ 3x14159265 Я думаю, что использование TypeScript действительно убивает, это усложняет JavaScript. 15.08.2013

  • 4

    Я не использовал машинописный текст, но для меня это похоже на проблему закрытия/области. Ваш успешный обратный вызов выполняется асинхронно, поэтому значение this внутри отличается. Попробуйте связать обратный вызов функции с this.

    this.http.get('http://localhost:9000/db').success(angular.bind(this,
        function(data: any, status: any) {this.bonus = data;});
    
    15.08.2013
  • Это не обязательно в машинописном тексте. См. ответ 3x14159265. 16.08.2013
  • Новые материалы

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

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..