Доступ к полям объекта из функций обратного вызова - PullRequest
1 голос
/ 17 марта 2012

Я недавно начал изучать разработку приложений метро с использованием js, и я столкнулся с проблемой обновления полей _title и _errorMessage в функциях обратного вызова _success и _error.Когда эти функции вызываются this, больше не ссылаются на MyClass объект.Поэтому мой вопрос заключается в том, как обновить эти два поля из функций обратного вызова.

(function () {

 var MyClass = WinJS.Class.define(
            function () {},

            {
                _title: "",
                _errorMessage: "",

                Authorize: function () {
                    WinJS.xhr({url:"http://example.com"})
                        .then(this._success,this._error);
                },
                _success: function(data){
                    this._title = data.responseData;
                },
                _error: function (data) {
                    this._errorMessage = data.responseData;
                }

            },
            {

            }
        );

    WinJS.Namespace.define("MynameSpace",
        {
            MyClass: MyClass
        });

})();

Ответы [ 2 ]

2 голосов
/ 17 марта 2012

Одна вещь, которую вы можете сделать, это использовать метод функций bind для установки контекста.

(function () {

 var MyClass = WinJS.Class.define(
            function () {},

            {
                _title: "",
                _errorMessage: "",

                Authorize: function () {
                    WinJS.xhr({url:"http://example.com"})
                        .then(this._success,this._error);
                },
                _success: (function(data){
                    this._title = data.responseData;
                }).bind(this),
                _error: (function (data) {
                    this._errorMessage = data.responseData;
                }).bind(this)

            },
            {

            }
        );

    WinJS.Namespace.define("MynameSpace",
        {
            MyClass: MyClass
        });

})();

Я не понимаю, как эти функции могут вызываться в неправильном контексте. Неважно, я вижу.

1 голос
/ 17 марта 2012

Вы можете использовать переменную прокси, как показано ниже

Authorize: function () {
     var _this = this;
     WinJS.xhr({url:"http://example.com"}).
     then(function(data){
              _this._success(data);
          }, function(data){
              _this._error(data);
          });
}
...