2016-11-22 7 views
0

私の場合:angularjsの "then()"メソッドを返す方法は?

app.js

let app = angular.module('myApp', []); 

app.controller('login', function ($scope, $login) { 
    $scope.account = {}; 

    $scope.loginForm_submit = function ($event, account) { 
     $event.preventDefault(); 

      if ($login.isValid(account)) { 
       $login.submit(account); 

       // goal: 

       $login.submit(account).then(function() { 
        window.location = '/' 
       }, function (msg) { 
        console.log(msg) 
       }); 
      } 
    }; 
}); 

login.js

let data = { 
    'Success': false, 
    'ErrorMessage': 'Invalid login attempt.' 
}; 

私はthen()メソッドの後方を返したい:

app.factory('$login', function() { 
    let o = { 
     isValid: function (x) { 
      let success = false; 

      // validating... 

      return success 
     }, 
     submit: function (x) { 
      // prevent to force submitting 
      if (this.isValid(x)) { 
       let formData = new FormData(), xhttp = new XMLHttpRequest(); 

       // appending data to 'formData' via 'x'... 

       xhttp.onreadystatechange = function() { 
        if (xhttp.readyState === XMLHttpRequest.DONE) { 
         let data = JSON.parse(xhttp.responseText); 

         if (data['Success']) { 
          // return then() with successCallback() function 
         } else { 
          let msg = data['ErrorMessage']; 

          // return then() with errorCallback() function        
         } 
        } 
       } 

       xhttp.open('POST', '/account/register'); 
       xhttp.send(formData); 
      } 
     } 
    } 

    return o 
}); 

dataは、オブジェクトのようなものですその結果にアクセスするために提出する。どうやってやるの?

UPDATE:コントローラで

:すべての

[HttpPost] 
public async Task<ObjectResult> Login(LoginViewModel model) 
{ 
    IDictionary<string, object> value = new Dictionary<string, object>(); 
    value["Success"] = false; 

    if (ModelState.IsValid) 
    { 
     // login 
     value["Success"] = true; 
    } 

    return new ObjectResult(value); 
} 
+0

約束を返すために$ qを使用 – simon

+3

なぜこのすべてのajaxを自分でやっていますか?角は、その呼び出しに約束を返す '$ http'を提供します。 – tkausl

+0

あなたは '$ q'を使用するべきです – vistajess

答えて

2

まず、あなた自身の機能のための$を使用しないでください。

問題については、$qを使用する必要があります。そして、あなたはどの角度のオファーをあなたに使うべきですか?

これは私があなたに与えてみましょう:

app.factory('loginFactory', function($q, $http) { 
    var ret = { 
     isValid: isValid, 
     submit: submit 
    } 

    return ret; 

    function isValid(x) { 
     // Your code ... 
     return false; 
    } 

    function submit(x) { 
     // x is your form data, assuming it's a JSON object 

     var deferred = $q.defer(); 

     // Assuming you're posting something 
     $http.post('yoururl', x,{yourConfigAsAnObject: ''}) 
     .then(function(success){ 
      console.log(success.data); 
      deferred.resolve(success.data); 
     }, function(error) { 
      console.log(error); 
      deferred.reject(error); 
     }); 

     return deferred.promise; 
    } 
}); 

今、あなたのコントローラでは、あなたが

loginFactory.submit(yourParam).then(function(success){ 
    // Your code 
}, function(error) { 
    // Your code 
}); 
+0

ありがとう!あなたはなぜ '関数で$を使うのを避けるべきですか'を説明できますか? –

+0

たとえば、angularMaterialを使用すると、 '$ mdDialog'というサービスがあります。したがって、あなたが '$ mdDialog'というサービスをあなたのサービスにすることに決めたなら、あなたは矛盾します。あなたはポイントを得る?だからあなたは自分の関数を '$'で呼ぶことができますが、 '$ myAppLoginFactory'のような特定の名前を与えることができます – trichetriche

1
app.factory('$login', function ($q) { 
let o = { 
    isValid: function (x) { 
     let success = false; 

     // validating... 

     return success 
    }, 
    submit: function (x) { 
     var d = $q.defer(); 
     // prevent to force submitting 
     if (this.isValid(x)) { 
      let formData = new FormData(), xhttp = new XMLHttpRequest(); 

      // appending data to 'formData' via 'x'... 

      xhttp.onreadystatechange = function() { 
       if (xhttp.readyState === XMLHttpRequest.DONE) { 
        let data = JSON.parse(xhttp.responseText); 

        if (data['Success']) { 
         // return then() with successCallback() function 
         d.resolve('success'); 
        } else { 
         let msg = data['ErrorMessage']; 
         d.reject(msg); 
         // return then() with errorCallback() function        
        } 
       } 
      } 

      xhttp.open('POST', '/account/register'); 
      xhttp.send(formData); 
     } 
     else { 
      d.reject('error'); 
     } 
     return d.promise; 
    } 
} 

return o 
}); 
1

男を使用することができ、私は約束してサンプル関数を作っ

$ qをする必要があります依存として注入される。

class AppUserService { 


constructor($http,CONFIG_CONSTANTS,$q, AuthService) { 
    this.API_URL = CONFIG_CONSTANTS.API_URL; 
    this.$http = $http; 
    this.$q = $q; 
    this.api_token = AuthService.api_token; 
} 

getAppUserList() { 
    const deferred = this.$q.defer(); 
    this.$http.get(`${this.API_URL}/customer?api_token=${this.api_token}`) 
     .success(response => deferred.resolve(response)) 
     .error(error => deferred.reject(error)); 
    return deferred.promise; 
} 
} 

はES6形式です。

使い方:

AppUserService.getAppuserList().then(success => { 
    // code for success 
},error => { 
    // code for error 
}) 
1
submit: function (x) { 

      return $q(function (resolve, reject) { 
       // prevent to force submitting 
       if (this.isValid(x)) { 
        let formData = new FormData(), xhttp = new XMLHttpRequest(); 

        // appending data to 'formData' via 'x'... 

        xhttp.onreadystatechange = function() { 
         if (xhttp.readyState === XMLHttpRequest.DONE) { 
          let data = JSON.parse(xhttp.responseText); 

          if (data['Success']) { 
           resolve(data); 
           // return then() with successCallback() function 
          } else { 
           let msg = data['ErrorMessage']; 
           reject(msg);       
          } 
         } 
        } 

        xhttp.open('POST', '/account/register'); 
        xhttp.send(formData); 
       } 
       else 
       reject('x not valid'); 
       } 
      } 
     } 

しかし、私は角$httpサービスを使用することをお勧めします。

関連する問題