当前位置: 首页 > 面试题库 >

AngularJS-指令与控制器

阎德宇
2023-03-14
问题内容

我正在尝试使用AngularJS创建我的第一个应用程序。但是,如果我需要针对特定​​情况使用指令,我会感到困惑。

我有一个简单的“地图”页面,需要在其中显示所选区域的纬度/经度值。目前,我根本没有使用指令。我在控制器中执行所有操作,并使用局部显示结果。我不打算在其他任何地方重用我的地图视图。这就是为什么我不觉得我需要指令

另一方面,我读到某个地方,每次您尝试在控制器中操作DOM(我正在使用google maps API进行操作)时,都应将其移至指令中。

这是我的简单控制器:

function MapViewController($scope) {
  $scope.zoom = 6;
  $scope.lat = 37;
  $scope.lon = -122;
  var mapOptions = {
    center: new google.maps.LatLng($scope.lat, $scope.lon),
    zoom: $scope.zoom,
    mapTypeId: google.maps.MapTypeId.HYBRID
  };
  $scope.map = new google.maps.Map(
      document.getElementById('map-canvas'), mapOptions);

  /*
   * Update zoom and other map attributes.
   */
  google.maps.event.addListener($scope.map, 'center_changed', function() {
    $scope.$apply(function () {
      $scope.zoom = $scope.map.getZoom();
      var center = $scope.map.getCenter();
      $scope.lat = center.lat();
      $scope.lon = center.lng();
      var bounds = $scope.map.getBounds();
      var northEast = bounds.getNorthEast();
      $scope.northEastLat = northEast.lat();
      $scope.northEastLon = northEast.lng();
      var southWest = bounds.getSouthWest();
      $scope.southWestLat = southWest.lat();
      $scope.southWestLon = southWest.lng();
    });
  });

  /*
   * Set zoom and other map attributes.
   */
  google.maps.event.addListener($scope.map, 'some event', function() {
    $scope.$apply(function () {
      ...
    });
  });

  /*
   * Add markers to map.
   */
  google.maps.event.addListener($scope.map, 'another event', function() {
    $scope.$apply(function () {
      ...
    });
  });

}

这是我的部分:

  <div id="map-controllers" class="span4">
    <form class="form-horizontal">
      <div class="control-group">
        <label class="control-label" for="inputNumber">Zoom:</label>
        <div class="controls">
          <input type="text" class="input-mini" placeholder="zoom" value="{{ zoom }}">
        </div>
      </div>
      <div class="control-group">
        <label class="control-label" for="inputNumber">Latitude:</label>
        <div class="controls">
          <input type="text" class="input-large" placeholder="Latitude" value="{{ lat }}">
        </div>
      </div>
      <div class="control-group">
        <label class="control-label" for="inputNumber">Longitude:</label>
        <div class="controls">
          <input type="text" class="input-large" placeholder="Longitude" value="{{ lon }}">
        </div>
      </div>
      <div class="control-group">
        <label class="control-label" for="inputNumber">North East Latitude:</label>
        <div class="controls">
          <input type="text" class="input-large" placeholder="Latitude" value="{{ northEastLat }}">
        </div>
      </div>
      <div class="control-group">
        <label class="control-label" for="inputNumber">North East Longitude:</label>
        <div class="controls">
          <input type="text" class="input-large" placeholder="Longitude" value="{{ northEastLon }}">
        </div>
      </div>
      <div class="control-group">
        <label class="control-label" for="inputNumber">South West Latitude:</label>
        <div class="controls">
          <input type="text" class="input-large" placeholder="Latitude" value="{{ southWestLat }}">
        </div>
      </div>
      <div class="control-group">
        <label class="control-label" for="inputNumber">South West Longitude:</label>
        <div class="controls">
          <input type="text" class="input-large" placeholder="Longitude" value="{{ southWestLon }}">
        </div>
      </div>
    </form>
  </div>

问题答案:

这是一个简短的独立答案,其中包含指向官方文档的链接,以获取更多信息(为更好地添加“服务”的定义):

http://docs.angularjs.org/guide/controller

在Angular中, 控制器 是JavaScript构造函数,用于扩展Angular范围。

当通过ng- controller指令将控制器附加到DOM时,Angular将使用指定控制器的构造函数实例化一个新的控制器对象。新的子作用域将作为控制器的构造函数的可注入参数可用$scope

http://docs.angularjs.org/guide/directive

从高层次 上讲伪指令
是DOM元素(例如属性,元素名称或CSS类)上的标记,它们告诉AngularJS的HTML编译器($compile)将指定的行为附加到该DOM元素,甚至转换DOM元素及其孩子们。

http://docs.angularjs.org/guide/services

Angular 服务 是使用依赖项注入(DI)连接在一起的可替换对象。您可以使用服务来组织和共享应用程序中的代码。



 类似资料:
  • 问题内容: 我可能会考虑将其完全倒退,但是我正在尝试制作三个嵌套指令,让它们称为:屏幕,组件和小部件。我希望窗口小部件能够触发组件中的某些行为,从而触发屏幕中的某些行为。所以: 我可以使用来在小部件的链接fn中要求父组件,但是如何进一步使组件控制器访问其包含的屏幕呢? 我需要的是WHAT in组件,因此,当您单击小部件的按钮时,它会发出“ screeny!”警报。 谢谢。 问题答案: 您可以通过以

  • 问题内容: 我正在一个小团队中工作,使用AngularJS进行构建,并试图维护一些基本标准和最佳实践。特别是考虑到我们相对较新的Angular。 我的问题是关于指令的。更准确地说,是选项。 因此,我们中的某些人在html 中使用了它。 别人都在用,并具有在html。 然后,当然可以使用以上两种方法之一。 目前,这没什么大不了的,尽管当这个项目达到预期的规模时,我希望任何人都可以轻松地了解正在发生的

  • 问题内容: 我想触发一个包含jQuery指令的AngularJS自定义指令。如何做呢?我已经在指令中阅读了关于发射功能的信息? 想法? 问题答案: 您可以使用服务在控制器和指令之间进行通信。 服务可能如下所示: 该指令可以响应服务: 只需将我所做的替换为jQuery操作,您就应该拥有所需的东西。 这是一个有效的小提琴:http : //jsfiddle.net/jeremylikness/wqXY

  • 问题内容: 谁能告诉我如何在另一个angularJS指令中包含一个指令中的控制器。例如我有以下代码 通过所有帐户,我应该能够使用addProduct指令访问控制器,但是我不能。有更好的方法吗? 问题答案: 我很幸运,并在对问题的评论中回答了这个问题,但是为了完整起见,我发布了完整的答案,因此我们可以将此问题标记为“已回答”。 这取决于您要通过共享控制器来完成的工作。您可以共享同一控制器(尽管实例不

  • 问题内容: 我已经阅读了几篇有关angularjs实体正确用法的文章:服务,工厂,控制器和指令。 我特别关心的是控制器和服务的比较。但是,没有一个帖子告诉我什么是控制器可以执行服务不能执行的操作,反之亦然。 可以列出它吗?或者仅仅是在angular的用法上规范? 问题答案: 控制器 通常用于绑定视图。控制器管理视图的生命周期,应将其视为视图控制器。将为视图的每个实例创建一个新的控制器,这意味着,如

  • 问题内容: 在上一个问题之后,我现在尝试从指令中调用父控制器上的方法。我得到一个未定义的参数。这是我的工作: 和脚本: 调用updatePerson方法时,person是未定义的。 jsfiddle在这里:http : //jsfiddle.net/graphicsxp/Z5MBf/7/ 问题答案: 只需简单地如下更改您的html 您没有通过updatePerson传递“人”,这就是为什么它不起作