2

基本的に私がやりたいことは、プロミスを解決する関数呼び出しからモデル値を割り当てることです。そのようです

value = someFun()

これは、この関数を呼び出すサービスです

app.factory('SomeService', function($q) {
    return {
        someFun: function() {
            var d = $q.defer();
            try {
                d.resolve("hi");
            } catch (e) {
                d.reject(e);
            }
            return d.promise.then(function(text){
                return text;
            });
        }
    };
});

ここにHTMLコードがあります

<div ng-init="value = 'yes'">
    <pre>{{value |json}}</pre>
</div>
<button type="button" ng-click="value = someFun()">click me</button>

そして、これはコントローラーにあります

$scope.someFun = SomeService.someFun;

plnkrはこちら

http://plnkr.co/edit/qO5ofBXZDsi3cS3bBnT8

現在、空のオブジェクトを返します。なにが問題ですか?

編集:以下で既に回答されているように、はい、これは 1 つの方法ですが、ngRepeat で SomeService.someFun を呼び出したいとしましょう。

EDIT2:ここに答えがあります-> ngRepeat内のAngular UI Bootstrapモーダル

4

4 に答える 4

2

一般に、非同期に更新されるものを使用して、コントローラーコードも記述せずにビューに表示する場合 (これは、ng-view 内で関数を呼び出したかったため、質問の場合です)、次にする必要があります。空白のプレースホルダー オブジェクトを返し、promise の結果をそれにマージするか、ビューで参照できるそのオブジェクトのプロパティを更新します。

あなたの質問は抽象的すぎて、これにアプローチしてアプリケーションに意味をなす正確な方法を知ることはできませんが、一般的な (そして抽象化された) アイデアプランカーは次のとおりです

.factory('promiseService', function($q){
  return {
    someDeferredThing: function(){
      var placeholder = {};
      var d = $q.defer();
      d.promise.then(function(text){
        placeholder.text = text;
      });
      d.resolve("hi");
      return placeholder;
    }
  }
)

サービスは、promise 自体ではなく、promiseによって更新されるオブジェクトを返します。promise を返す場合は.then()、値を取得するために etc. を処理する必要があります。

.controller('appCtrl', function($scope, promiseService){
  $scope.deferredResult = promiseService.someDeferredThing();
});

これは、値をスコープに割り当てる方法です。

$scope.deferredResult.textpromise が解決されるまで undefined になります。その後、 defined になり、 に解決され"text"ます。そのため、ビューは未定義の状態を短時間処理する必要があります。通常は、 を使用して非常に簡単に処理できますng-show

于 2014-08-12T11:20:51.660 に答える
1

コントローラー.js:

  $scope.someFun = function () {
        return someservice.someFun().then(function (data) {
            $scope.value = data;
        });
    }

someservice.js:

    function someFun() {
        var d = $q.defer();
        try {
            d.resolve("hi");
        } catch (e) {
            d.reject(e);
        }
        return d.promise;
    }

html:

 <div ng-init="value = 'yes'">
                <pre>{{value |json}}</pre>
            </div>
            <button type="button" ng-click="someFun()">click me</button>
于 2014-08-12T11:02:07.310 に答える