是$ http?是$ scope。$ apply?

时间:2015-01-19 04:58:34

标签: javascript angularjs

我是AngularJS的新手(与v.1.2.27一起玩)。我是这样一个简单的控制器(html在头部包含.js文件......呃!):

'use strict';

var sample = angular.module('ding', []);    
    sample.controller('sampleCtrl',function($scope,$http){
        $scope.testme = "sdsds";
        $http.get('/get/me/some/data').
            success(function(data, status, headers, config) {
                $scope.datayouwant = data;
            }).
            error(function(data, status, headers, config) {
            });     
        });

AJAX调用" / get / me / data"工作,并没有需要JSONP的东西来完成这项工作。现在有一个明显/简单的HTML这样的:

   <dt ng-controller='sampleCtrl'>United States</dt>
    <dd>{{ testme }}</dd>

表达式testme或{{datayouwant}}不会产生任何结果。我只需要在这里显示来自AJAX调用的值(一种单向数据绑定)。我为何不起作用感到困惑和茫然。我测试了chrome和FF(两个最新版本)。我读了一些关于$ scope。$ apply()的东西,但也读到$ http隐含地有那个调用,甚至试图包括但是FF / chrome大声抱怨......

请帮帮我。

1 个答案:

答案 0 :(得分:3)

您的控制器也需要包装dd,因为它需要来自控制器的范围绑定。目前它仅适用于dt,因为您在dt上有ng-controller指令。

试着举例:

  <dl ng-controller='sampleCtrl'>
    <dt >United States</dt>
    <dd>{{ testme }}</dd>
  </dl>

因此,拇指规则是当您对任何元素使用ng-controller指令时,只有该元素和该元素内的任何内容(隔离范围指令除外)将直接或间接访问控制器范围(原型继承)。在你的情况下,angular会从testme的可用范围评估dd的值,如果没有其他控制器包装它们,它将根据$rootScope进行评估,并且不会显示任何内容如果该范围内该属性的值不可用。

是的,你是对的,在http回调运行后你不需要执行$scope.$apply()。内部角度将触发摘要周期。

工作代码

&#13;
&#13;
var sample = angular.module('ding', []);
sample.controller('sampleCtrl', function($scope, $http) {
  $scope.testme = "sdsds";
  $http.get('/get/me/some/data').
  success(function(data, status, headers, config) {
    $scope.datayouwant = data;
  }).
  error(function(data, status, headers, config) {});
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="ding">
  <dl ng-controller='sampleCtrl'>
    <dt>United States</dt>
    <dd>{{ testme }}</dd>
  </dl>
</div>
&#13;
&#13;
&#13;