2013-07-05 34 views
1

可以說我有以下看法代碼:AngularJS - 從視圖傳遞迴調?

<button ng-click="login()">Login</button> 

如果我想從視圖到控制器傳遞一個回調登錄方法,我會怎麼做呢?

我想要做的事,如:

<button ng-click="login(function() { 
          $('#loginDialog').modal('hide'); 
         })">Log in</button> 

但角度不會解析該代碼NG單擊,這樣就不會工作。

我想要做的是將DOM操作從控制器中分離出來,並轉換爲控制器可以調用的回調函數。 因此,使控制器更可測試。

我知道有一個對話服務的角度,但讓我們假裝用例不是對話框,只是其他一些DOM改變的東西。

我是否必須訴諸服務注入並在服務中註冊所有回調並將該服務注入到我的控制器中? 我想在這裏注入方法注入而不是構造函數注入。

那麼,有沒有辦法做這樣的事情是什麼,我上面描述?

+0

看看http://stackoverflow.com/a/15012542/527968特別是2號。 –

回答

0

在角度,做DOM操作的最佳方法是使用指令 ...或者你的觀點與邏輯像ng-showng-hide

只需創建一個指令與包裹你的模式窗口指令結合,或使用角度ui bootstrap的$對話服務..這是一個很好的。

+0

我知道如何使用ng-show和hide,但是在沒有模型狀態用於更改的情況下,例如,在控制登錄可見性的「isLoggingIn」模型中有一個布爾值會很難看form/dialog/div /無論在這種情況下,我想通過代碼,從控制器進行更改......即使有指令,我也不知道如何將回調傳遞給我的控制器功能 –

+0

使用「isLoggingIn」布爾值是「角度的方式」,因爲你可以很容易地在控制器內進行測試,並且在視圖中測試jQuery邏輯真的很難,它也花了我一段時間才能用到「角度的方式」,但這是他們的建議從邏輯上分離視圖,從我的經驗來看,它在單元測試中是有意義的 –

+0

對角服務在角度上不依賴任何fugly isLoggingIn狀態拋棄你的模型,所以。關閉$ dialog服務中對話框的功能,正如我建議的那樣,將dom操作抽象出來。他們的代碼會在我想要的地方做一個.modal('hide').. –

0

我結束了一個服務做:

app.service('userEvents', function() { 
    this.loggedIn = function() { 
     $('#loginDialog').modal('hide'); 
    }; 
    this.registered = function() { 
     $('#registerDialog').modal('hide'); 
    }; 
}); 

想在此之後,它無關,與DOM或角或角的方式。 關閉登錄表單是用戶登錄系統的副作用。

因此。我爲用戶創建了一個事件服務。 所以控制器可以在用戶登錄或註冊時通知服務等。

然後,服務可以決定發生此類事件時該怎麼做。 例如發送電子郵件,關閉對話框或其他與模型本身無關的行爲。

相關問題