首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正在等待同级控制器的函数

正在等待同级控制器的函数
EN

Stack Overflow用户
提问于 2019-05-01 20:31:24
回答 1查看 55关注 0票数 0

我使用的是AngularJS,我有两个控制器,它们是兄弟。第一个控制器在单击时从$http请求中获取数据。第二个控制器必须检索这些数据,但我不知道这个控制器将如何获取数据,因为它必须等待第一个控制器中的函数才能获取数据。

这是第一个控制器:

代码语言:javascript
运行
复制
$scope.getMessageData = function(username, full_url, main_item, item_id, sub_id){
    $scope.ajax_spinner = true;
    $http({
      method: "GET",
      url: "/getMessageData",
      params:{
        "adUsername" : username,
        "fullUrl" : full_url,
        "mainItem" : main_item,
        "tagId" : item_id,
        "subId" : sub_id
      }
    }).then(function successCallback(response) {
      $scope.adUsername = response.data.adUsername;
      $scope.fullUrl = response.data.fullUrl;
      $scope.main_item = response.data.main_item;
      $scope.message = response.data.docs[0];
      $scope.sub_item = response.data.sub_docs[0];
      $scope.ajax_spinner = false;
      Data.setItem($scope.message)
    });
  };

我用来与第二个控制器共享数据的工厂:

代码语言:javascript
运行
复制
App.factory('Data', function(){
    return { 
    setItem: function(item){
        this.item = item;
    },
    getItem: function(){
        return this.item;
    }
    };
});

第二个控制器:

代码语言:javascript
运行
复制
App.controller("dataController", function($scope, $http, $sce, Data){
  $scope.message = Data.getItem();
  console.log($scope.message)
});

现在很明显,$scope.message是未定义的,因为控制器已经在页面加载时加载,但是getMessageData函数还没有准备好调用,那么在触发getMessageData之前,我如何“等待”第二个控制器加载呢?

EN

回答 1

Stack Overflow用户

发布于 2019-05-02 16:02:39

你可以在你的controller中使用$watch来跟上你service中的变化,例如

代码语言:javascript
运行
复制
var unwatch = $scope.$watch(function() {
  /* set Data.item value in your service */
  return Data.item;
}, function(item) {
  $scope.item = item || 'nothing here';
});

$scope.$on('$destroy', unwatch);

或者,您可以实现简单的机制来注册和注销服务中的回调,以便在数据发生更改时得到通知,例如

模板

代码语言:javascript
运行
复制
<html ng-app="App">
  <head>
  ...
  </head>

  <body>
    <div ng-controller="SomeController">
      SomeController
      <button ng-click="getData()">Fetch</button>
      <div ng-bind="data | json"></div>
    </div>
    <br>
    <div ng-controller="OtherController">
      OtherController
      <div ng-bind="data | json"></div>
    </div>
  </body>
</html>

JavaScript

代码语言:javascript
运行
复制
angular.module('App', [])

.controller('SomeController', function($scope, Data) {
  $scope.getData = function() {
    Data.getData().then(function(data) {
      $scope.data = data;
    });
  };
})

.controller('OtherController', function($scope, Data) {
  var callback = function(data) {
    $scope.data = data;
  };

  Data.register(callback);

  $scope.$on('$destroy', function() {
    Data.unregister(callback);
  }); 
})

.factory('Data', function($http) {
  var callbacks = [];

  return {
    register: function(callback) {
      var index = callbacks.indexOf(callback);
      if (index === -1) {
        callbacks.push(callback);
      }
    },
    unregister: function(callback) {
      var index = callbacks.indexOf(callback);
      if (index !== -1) {
        callbacks.splice(index, 1);
      }
    },
    getData: function() {
      /* where data.json is { "message": "My message" } */
      return $http.get('data.json').then(function(response) {
        var data = response.data;
        data.timestamp = (new Date()).getTime();
        /* move inside $interval out of this fn maybe... */
        angular.forEach(callbacks, function(callback) {
          callback(data);
        });
        return data;
      });
    }
  };
});

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55936327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档