2013-05-14 62 views
29

controller我按照方法:如何在angularjs中从HTML中调用工厂方法?

var isPaused = false; 

$scope.switcher = function (booleanExpr, trueValue, falseValue) { 
    return booleanExpr ? trueValue : falseValue; 
}; 

$scope.isPaused = function() { 
    return isPaused; 
}; 

我可以从HTML喜欢叫它:

<body ng-controller="Cntrl"> 

... 
<h4> 
{{ switcher(isPaused(), 'Search Address Mode', 'Search Location Mode')}} 
</h4> 
<div class="btn-group"> 
    ...  
</div> 

正如你看到的,如果isPaused()回报false我得到<h4>Search Location Mode</h4>

这是实用工具,因此我想将其定义为factory

feederliteModule.factory('switcher', function() { 
return { 
    sw: function (booleanExpr, trueValue, falseValue) { 
     return booleanExpr ? trueValue : falseValue; 
    } 
    }; 
}); 

无异常,但

当我试图把它想:

<h4> 
{{ switcher.sw(isPaused(), 'Search Address Mode', 'Search Location Mode')}} 
</h4> 
<div class="btn-group"> 
    ...  
</div> 

什么也没有发生。

**我向控制器添加了'switcher'

如何从HTML调用工厂方法?

(*欢迎你改变/编辑我的问题,如果它似乎不明确)

谢谢

+0

你是怎么做到的?我也有类似的问题......可能是我不应该这样做, – trainoasis 2014-02-11 13:29:34

+0

@ user1524316好吧,看下面的回答 – 2014-02-11 13:36:09

+0

我以为它并没有完全解决你的问题,因为它不接受? – trainoasis 2014-02-11 13:41:22

回答

52

好了,你没有真正应该做的......但你可以 do将你的服务对象放在$ scope的一个属性中,并从那里调用它。

app.controller('MyCtrl', function($scope, switcher) { 
    $scope.switcher = switcher; 
}); 
+3

为什么不能假设?这似乎是凌乱?你的解决方案有效问题是为什么如果'controller'收到'switcher'标识符,我需要创建'$ scope.switcher'。谢谢 – 2013-05-14 14:19:19

+7

HTML视图只能链接到Controller(使用$ scope变量)或者使用Directives扩展。任何其他方式不是角度的方式:) – Chandermani 2013-05-14 14:28:05

+0

@Chandermani我在几个控制器中使用这种方法,简单/简短的方法是创建工厂或服务。 – 2013-05-14 14:34:47

3

我有一个更一般的问题,“如何在页面加载时从html中调用angularjs范围/工厂/服务。”我的解决方案是在ng-show中调用该方法。

  1. 在周围有问题的情况下最高的元素,
  2. 呼叫使用NG-显示指令的方法。
  3. 该方法将在显示页面之前运行。
  4. 请注意,您也可以使用这样一个解决方案,以确保引导工作之前,显示一个页面完成(这可以减少运动部件的数量以散乱渲染)

<div ng-show="runThisMethod(someVarOnScope)" .....>