You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AngularJS新手求助:Factory调用Controller失败问题排查

AngularJS: 无法在Controller中调用Factory方法的问题排查与修复

嘿,我来帮你梳理下这段代码里的问题,都是些容易忽略的小细节,咱们一个个解决:

问题1:Factory错误使用$scope

Factory属于Angular的服务类,根本不能直接访问$scope——$scope是Controller专属的作用域对象。你在myFactory的getsum函数里试图给$scope.service赋值,这完全不符合Angular的设计逻辑,Factory只负责处理业务逻辑、返回数据,不该直接操作Controller的作用域。

问题2:getsum函数没有返回值

你定义的getsum函数只是尝试赋值,但没有返回任何内容,导致Controller调用myFactory.getsum()时得到的是undefined,自然没法把值传给$scope.service。

问题3:HTML里的两处语法错误

  • 控制器名称写错:JS里定义的是helloController,但HTML里写成了hello controller(中间多了空格),Angular根本找不到对应的控制器。
  • ng-click未触发函数:ng-click="clickme"要改成ng-click="clickme()",否则点击按钮不会执行函数。

问题4:路由代码的语法冗余

你的路由配置最后多了一个}),会导致语法错误,影响整个应用初始化,得删掉。


修正后的完整代码

JS代码

app.factory("myFactory",function(){ 
  var something = {}; 
  something.getsum = function() { 
    // 直接返回需要的数据,不操作$scope
    return "hello people"; 
  } 
  return something; 
}); 

app.controller("helloController", function($scope,myFactory) { 
  $scope.clickme = function() { 
    $scope.service = myFactory.getsum(); 
  } 
}); 

HTML代码

<div ng-controller="helloController"> 
  <button ng-click="clickme()">点击显示内容</button> 
  <h2>{{service}}</h2> 
</div>

路由配置代码

$urlRouterProvider.otherwise("/index/utilise"); 
$stateProvider 
  .state('index', { 
    abstract: true, 
    url: "/index", 
    templateUrl: "display.html", 
    controller:'mainController', 
    controllerAs: "parentCtrl", 
  }) 
  .state('index.sample', { 
    url: "/home", 
    templateUrl: "content/sample.html", 
  }) 
  .state('index.utilise', { 
    url: "/utilise", 
    templateUrl: "content/utilise.html", 
  });

这样修改后,点击按钮就会调用Factory的getsum方法,把返回的字符串赋值给$scope.service,页面上的{{service}}就会正常显示内容啦~

内容的提问来源于stack exchange,提问作者ronaldino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:49:07