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

将异步获取的数据传递给指令

闽涵蓄
2023-03-14
问题内容

我目前有一个AngularJS
controller,它基本上是JSON通过$http.get()调用异步获取的,然后将获取的数据链接到某个范围变量。

controller代码的恢复版本:

mapsControllers.controller('interactionsController', ['$http', function($http) {
  var ctrlModel = this;

  $http.get("data/interactionsPages.json").
  success(function(data) {
    ctrlModel.sidebar = {};
    ctrlModel.sidebar.pages = data;
  }).
  error(function() {...});
}]);

然后,我有一个自定义directive,它通过一个HTML元素接收那些相同的作用域变量。

directive代码的恢复版本:

mapsDirectives.directive('sidebar', function() {
  return {
    restrict : 'E',
    scope : {
      pages : '@'
    },
    controller : function($scope) {            
      $scope.firstPage = 0;

      $scope.lastPage = $scope.pages.length - 1;

      $scope.activePage = 0;

      //...
    },
    link : function(scope) {
      console.log(scope.pages);
    },
    templateURL : 'sidebar.html'
  }
});

的恢复版本HTML

<body>
  <div ng-controller='interactionsController as interactionsCtrl'>
    <mm-sidebar pages='{{interactionsCtrl.ctrlModel.sidebar.pages}}'>
    </mm-sidebar>
  </div>
</body>

问题是,由于$http.get()是异步的,因此该指令已被严重初始化(例如:$scope.pages.length - 1未定义)。

尽管找到了一些似乎可以解决此问题的解决方案,但我找不到能为我解决该问题的任何方法。即,我试图观察变量,仅在检测到更改后才对变量进行初始化,如许多其他帖子所建议的那样。为了进行测试,我使用了类似的方法:

//... inside the directive's return{ }
link: function() {
  scope.$watch('pages', function(pages){
    if(pages)
      console.log(pages);
  });
}

我已经对其进行了测试,并没有多次调用$ watch函数(记录的值为undefined),我认为这意味着它没有检测到变量值的变化。但是,我确认该值已更改。

那么,这是什么问题呢?


问题答案:

sidebar在控制器中移动对象的声明,并将范围绑定更改为=

mapsDirectives.controller("interactionsController", ["$http", "$timeout",
    function($http, $timeout) {
        var ctrlModel = this;
        ctrlModel.sidebar = {
            pages: []
        };
      /*
      $http.get("data/interactionsPages.json").
          success(function(data) {
          //ctrlModel.sidebar = {};
          ctrlModel.sidebar.pages = data;
       }).
       error(function() {});
      */

      $timeout(function() {
        //ctrlModel.sidebar = {};
        ctrlModel.sidebar.pages = ["one", "two"];
      }, 2000);
    }
]);

mapsDirectives.directive('mmSidebar', [function() {
    return {
      restrict: 'E',
      scope: {
        pages: '='
      },
      controller: function() {},
      link: function(scope, element, attrs, ctrl) {
        scope.$watch("pages", function(val) {
          scope.firstPage = 0;
          scope.lastPage = scope.pages.length - 1;
          scope.activePage = 0;
        });
      },
      templateUrl: 'sidebar.html'
    };
}]);

然后匹配指令名称并删除花括号。

<mm-sidebar pages='interactionsCtrl.sidebar.pages'>
</mm-sidebar>

这是一个工作示例:http :
//plnkr.co/edit/VP79w4vL5xiifEWqAUGI



 类似资料:
  • 问题内容: 我有以下指令: 这是对象结构: 我希望它根据对象内部的数据生成一个链接。 不幸的是,由于我无法访问该对象的任何内部值,因此它不起作用,但是如果我将其传递给一个简单的数据结构,例如: 我可以使用访问它。 这是我的指令代码: 谢谢 问题答案: 在Angularjs官方网站上阅读说明: @或@attr- 将本地范围属性绑定到DOM属性的值。由于DOM属性是字符串,因此结果始终是字符串。如果未

  • 问题内容: 我想知道是否有一种方法可以将参数传递给指令? 我想做的是从控制器添加一个指令,如下所示: 是否可以同时传递一个参数,以便我的指令模板的内容可以链接到一个作用域或另一个作用域? 这是指令: 如果我想使用相同的指令但使用$ scope.title2怎么办? 问题答案: 这是我解决问题的方法: 指示 控制者 现在,我可以通过同一指令使用不同的作用域,并动态附加它们。

  • 问题内容: 我试图将回调函数从控制器传递给指令。 这是回调函数代码: 指令用法: 指令代码: 模板中的回调用法: 但是,这给了我以下错误: 我看过很多类似的问题,但不明白我在哪里错了。 问题答案: 从指令中调用表达式方法时,您需要以格式传递指令中的参数,还应更正指令属性值以像 指令用法: 指令模板

  • 问题内容: 我已经看过其他答案,但似乎无法解决这个问题。我正在尝试在DLL中调用一个函数以与SMBus设备进行通信。此函数采用指向结构的指针,该结构具有一个数组作为字段之一。所以… 在C中: 我想我必须在DLL填充数据数组时为Address,Command和BlockLength设置值。需要此结构的函数将其作为指针 因此,我已经像这样在Python中设置了结构: 注意:我也尝试过ctypes.c_

  • 我在js脚本中有以下内容: 其中sendData2是使用axios的异步调用。船长看起来像 在我的php文件中,我有: 但这是行不通的。我认为php会将$\u POST中的数组转换为字符串,但我不确定。 两个问题: 如何将$skipper转换回数组 我一直在尝试使用print\r查看服务器上的数据,但由于这是一个异步调用,它无法工作,因为print\r结果被发送回js脚本,而不是在屏幕上打印出来。

  • 问题内容: 假设我想将指针传递给函数并通过这样做来更改该指针指向的结构的值。我通常通过取消引用指针来做到这一点: 我的问题是,为什么这段代码不会改变价值 而这个做: 问题答案: 因为这一行: 只需为变量分配一个新的指针值即可。在函数内部,只是一个局部变量。通过向分配任何新值,您只是在更改局部变量的值,而 不是 指向的值。 中的局部变量与中的局部变量无关。如果你改变的,它不会改变的(这也不会改变尖结