2013-05-14 60 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)" .....>