2014-01-21 27 views
0

從我的理解中,工廠是對Angular提供者的抽象,它允許您使用較少的代碼行來返回數據。但是,提供商提供了更多的靈活性,因此您可以更好地定義服務的功能。我仍然很困惑如何從提供者調用一個簡單的函數。每個人似乎都以不同的方式做他們,我不能讓我的工作:角提供者中的Setter函數

myApp.provider('myProvider', function() { 
    myVar = true; 

    $get: function() { 
     return { 
      myVar: myVar, 
     } 
    }, 

    toggleFalse = function() { 
     myVar = false; 
    }, 
}) 

myApp.controller('myController', function($scope, myProvider) { 
    myProvider.toggleFalse(); 
}); 

這似乎並不工作 - 我無法理解服務一般。它說toggleFalse沒有定義。如何正確定義可通過控制器控制的Angular服務的setter函數?

+0

當你說它不起作用時,你究竟是什麼意思? –

+0

我不明白你到底想要做什麼。您正在提供程序中創建一個名爲「myVar」的本地函數範圍變量。注入提供程序時,您正在爲返回的對象創建單獨的'myVar'屬性。您是否想要提供商的所有實例共享一個全球價值,還是您希望每個價值都有自己的價值? –

+0

我期待有一個全球共享的價值。我不想設置全局變量,因爲我認爲可能有辦法避免這種情況。 – user3221399

回答

0

如果你這樣做console.dir(myProvider),你會看到你從$get返回的對象。您需要將函數放在返回的對象上:

$get: function() { 
    return { 
     myVar: myVar, 
     toggleFalse: function() { 
      myVar = false; 
     },   
    } 
}, 
0

這是一個簡單的關閉問題。

如果您希望每個實例都具有唯一的所有內容,那麼將所有內容都存儲在$get之內。

如果你想大多數的對象是唯一的,但有一些方法或對象/數組,每個實例股對方,然後定義那些在功能關閉$get之外並追加他們返回的對象$get

... ("myProvider", function() { 
    var sharedValue = 19, 
     sharedFunction = function() { 
      sharedValue += 1; 
      return shared value; 
     }; 


    return { 
     $get : function() { 
      return { 
       unique : 1, 
       shared : sharedFunction 
      }; 
     } 
    }; 

這不是一個角的問題,這麼多芯段的JS的行爲,這恰好是一個角範式內。