Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs Can';在“$http.get”请求中,不要放弃“$scope”,而选择“this”_Angularjs - Fatal编程技术网

Angularjs Can';在“$http.get”请求中,不要放弃“$scope”,而选择“this”

Angularjs Can';在“$http.get”请求中,不要放弃“$scope”,而选择“this”,angularjs,Angularjs,EDIT2: var LanguageCtrl; LanguageCtrl = function($scope, $http, $window) { var vm; vm = this; if ($window.navigator.language.indexOf('it') !== -1) { this.lang = 'it'; this.setLanguage = 'it'; } else { this.lang = 'en'; this.s

EDIT2:

var LanguageCtrl;

LanguageCtrl = function($scope, $http, $window) {
  var vm;
  vm = this;
  if ($window.navigator.language.indexOf('it') !== -1) {
    this.lang = 'it';
    this.setLanguage = 'it';
  } else {
    this.lang = 'en';
    this.setLanguage = 'us';
  }
  this.message = [];
  this.pizze = [];
  this.getPizze = function(lang) {
    $http.get('localization/pizze-' + lang + '.json').success(function(pizze) {
      vm.pizze = pizze;
    });
  };
  this.setLanguage = function(lang) {
    $http.get('localization/' + lang + '.json').success(function(data) {
      vm.lang = lang;
      vm.message = data;
      vm.getPizze(vm.lang);
      $window.location.href = '#!/order';
    });
  };
  this.setLanguage(this.lang);
};

angular.module('myApp').controller('LanguageCtrl', LanguageCtrl);

编辑:我所说的不起作用,当我使用
这个
而不是
$scope
时就不起作用了

我将以语法转到
控制器,当我对变量执行此操作时,一切都很好,但是当我对由
$http.get
填充的数组尝试相同的操作时,代码中断

不要在意那种可怕的
,只想测试代码延迟链接的样式

控制器

var LanguageCtrl;

LanguageCtrl = function($scope, $http, $window) {
  if ($window.navigator.language.indexOf('it') !== -1) {
    this.lang = 'it';
    this.setLanguage = 'it';
  } else {
    this.lang = 'en';
    this.setLanguage = 'us';
  }
  this.message = [];
  this.pizze = [];
  $scope.getPizze = function(lang) {
    $http.get('localization/pizze-' + lang + '.json').success(function(pizze) {
      $scope.pizze = pizze;
    });
  };
  $scope.setLanguage = function(lang) {
    $http.get('localization/' + lang + '.json').success(function(data) {
      this.lang = lang;
      $scope.message = data;
      $scope.getPizze(this.lang);
      $window.location.href = '#!/order';
    });
  };
  $scope.setLanguage(this.lang);
};

angular.module('myApp').controller('LanguageCtrl', LanguageCtrl);
index.html工作正常

<html ng-app="myApp" ng-controller="LanguageCtrl as langctrl" lang="{{langctrl.lang}}">

order.html没有

<button onclick="location.href='#!/cart'" ng-disabled="howManyPizze === 0">{{langctrl.message.cart}} {{howManyPizze === 0 ? langctrl.message.empty : '(' + howManyPizze + ')'}}</button>
<button onclick="location.href='#!/'">{{langctrl.message.change}}</button>
{{langctrl.message.cart}{{howManyPizze==0?langctrl.message.empty:'('+howManyPizze+')}
{{langctrl.message.change}
使用上述代码来处理角度代码


在此处创建Plukar

问题在于,当您的
$http.get()
解决时,此
的自引用不可用。这就是为什么您经常会看到
var vm=this或类似于控制器中第一行的内容。通过将
分配给控制器中的局部变量,您可以在承诺解决时访问该变量。简言之,添加

var vm = this;
…连接到控制器,然后将
$http.get()
更改为此

vm.setLanguage = function(lang) {
    $http.get('localization/' + lang + '.json').success(function(data) {
        vm.lang = lang;
        vm.message = data;
        vm.getPizze(vm.lang);
        $window.location.href = '#!/order';
    });
};
更新
我在最初的回答中遗漏了这一点:

$scope.getPizze = function(lang) {
    $http.get('localization/pizze-' + lang + '.json').success(function(pizze) {
        $scope.pizze = pizze;
    });
};
需要对其进行更改以消除
$scope
的使用

vm.getPizze = function(lang) {
    $http.get('localization/pizze-' + lang + '.json').success(function(pizze) {
        vm.pizze = pizze;
    });
};

嗯,也许我的问题写得不好。如何从
$scope
切换到
this
。在这种情况下,我不能使用
this
而不是
$scope
?因为如果我从message.value中删除langctrl,我的代码将更新。请确认它是否工作。我使用example.json文件提供服务。您可以使用自己的。我感谢您的帮助,但我是在问如何摆脱
$scope
,就像在另一个答案中一样
消息
起作用,但似乎我无法呼叫
getPizze
。问题更新为您的建议,我做了什么不好?那是我的不好-我错过了在将该函数添加到控制器时您仍在使用
$scope
。我的答案已经更新了。我建议在使用
var vm=this
您只需在任何地方使用
vm
来代替
this
。混合使用这两个标识符看起来很奇怪,也许这有助于在代码中更清楚地使用单个标识符。我已经更改了它(事实上它在我的edit2中),但我的ngRepeat不起作用。。。然后我想起了“Controller as”语法,一切都很好:D谢谢!
vm.getPizze = function(lang) {
    $http.get('localization/pizze-' + lang + '.json').success(function(pizze) {
        vm.pizze = pizze;
    });
};