首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >控制器从工厂接收未定义的调用函数。

控制器从工厂接收未定义的调用函数。
EN

Stack Overflow用户
提问于 2016-10-18 14:17:43
回答 2查看 168关注 0票数 1

代码包含两个控制器teacherrenderteacher控制器在工厂share中设置值,render从工厂调用get()函数以在$scope.maincode中接收值,但console.log($scope.maincode)显示未定义。因此,HTML页面不呈现{{m.code}}值。下面是相关的片段。

控制器-1

代码语言:javascript
复制
app.controller("teacher",function($rootScope,$scope,$http,$location,$window,share){
    $scope.load = function(){
      $http.get('/getcode').success(function(data){
        if(data.length>0){
          $scope.message = "";
          $scope.codes = data;
          console.log($scope.codes);
        }
        else {
          $scope.codes="";
          $scope.message = "No code submissions yet";
        }
      })
      $scope.send = function(id){
        console.log(id);
        $http.get("/code/"+id).success(function(data){
          share.set(data);
          $window.location.href ='/code';
        })
      }
    });

controller-2

代码语言:javascript
复制
app.controller('render',function($rootScope,$scope,share){
  $scope.renders = function(){
    $scope.m=share.get();
    console.log($scope.m);
    }
  });

工厂

代码语言:javascript
复制
app.factory('share',function(){
  var data = {};
  this.set = function(obj){
    this.data = obj;
    console.log(this.data);
  }
  this.get = function(){
    return this.data;
  }
  return {
    set: this.set,
    get: this.get
 }

});

HTML文件

代码语言:javascript
复制
<!DOCTYPE html>
<html>
  <head>
    <base href="/" />
    <script src="js/angular.min.js"></script>
    <script src="js/angular-route.min.js"></script>
    <script src="js/angular-resource.min.js"></script>
    <script src="js/app.js"></script>
  </head>
  <body ng-app="app" ng-controller="render">
    <div  data-ng-init="renders()">
      {{m.code}}
    </div>
    <a href="/logout">Logout</a>
  </body>
</html>

HTMLFile-2(调用教师控制器)

代码语言:javascript
复制
<!DOCTYPE html>
<html>
  <head>
    <base href="/" />
    <script src="/js/angular.min.js"></script>
    <script src="/js/angular-route.min.js"></script>
    <script src="/js/angular-resource.min.js"></script>
    <script src="/js/app.js"></script>
  </head>
  <body ng-app="app">
    <div data-ng-controller="teacher">
      <div data-ng-init="load()">
        <div ng-repeat="code in codes" ng-show="codes">
          <a href ng-click="send(code.id)">{{code.title}}</a>
        </div>
      </div>
      <div>
        <h4>{{message}}</h4>
      </div>
    </div>
    <a href="/logout">Logout</a>
  </body>

我在谷歌上搜索了这个问题,阅读了有关类似问题的现有问题,但没有找到解决办法。请帮帮忙。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-18 14:28:00

由于您使用的是两个不同的页面,所以需要使用一些路由器,例如ngRouterui-router,或者使用localStorage。下面是使用localStorage的示例

代码语言:javascript
复制
app.factory('share', function () {
    function set(obj) {
        localStorage.setItem('share', obj);
    }

    function get() {
        return localStorage.getItem('share');
    }

    return {
        set: set,
        get: get
    }
});
票数 1
EN

Stack Overflow用户

发布于 2016-10-18 15:09:56

在显示renderm.code时,您不会从承诺中得到结果。

要克服这一点,只需在从broadcast控制器中的get请求中获得值之后,将其放到作用域上。

代码语言:javascript
复制
`$rootScope.$broadcast('data-received');`

现在,您可以在呈现controller中侦听此事件。

代码语言:javascript
复制
$scope.$on('data-received', function(event, args) {
      $scope.m=share.get();
});

控制器-1

代码语言:javascript
复制
app.controller("teacher",function($rootScope,$scope,$http,$location,$window,share){
    $scope.send = function(id){
      console.log(id);
      $http.get("/code/"+id).success(function(data){
        share.set(data);
        $rootScope.$broadcast('data-received');
        $window.location.href ='/code';
      })
    }
  });

控制器-2

代码语言:javascript
复制
app.controller('render',function($rootScope,$scope,share){
    $scope.renders = function(){
      $scope.m=share.get();
      console.log($scope.m);
      }

      $scope.$on('data-received', function(event, args) {
        $scope.m=share.get();
      });
    });

这应该能解决你的问题。

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

https://stackoverflow.com/questions/40110702

复制
相关文章

相似问题

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