ng Init不能异步工作(使用$ q promise)

时间:2013-10-26 19:56:43

标签: javascript angularjs angularjs-controller

编辑: Plunker正在工作,实际代码不是: http://plnkr.co/edit/5oVWGCVeuTwTARhZDVMl?p=preview

该服务包含典型的getter \ setter内容,除此之外,它运行正常,所以我没有发布它的代码以避免TLDR。

TLDR版本:尝试将使用AJAX获取的值ng-init到文本区域的ngModel中,请求使用正确的值解析,但textarea仍为空。

父控制器功能(与服务对话):

$scope.model.getRandomStatus = function(){
    var deffered = $q.defer();
var cid = authService.getCompanyId();

var suggestions = companyService.getStatusSuggestions(cid);
if(suggestions && suggestions.length > 0){
        deffered.resolve(suggestions[Math.floor(Math.random(suggestions.length) + 1)].message);
        return deffered.promise;//we already have a status text, great!
    }

    //no status, we'll have to load the status choices from the API
    companyService.loadStatusSuggestions(cid).then(function(data){
        companyService.setStatusSuggestions(cid, data.data);
        var result = data.data[Math.floor(Math.random(data.data.length) + 1)];
        deffered.resolve(result.message);   
    },
    function(data){
        _root.inProgress = false;
        deffered.resolve('');
        //failed to fetch suggestions, will try again the next time the compnay data is reuqired
    });
    return deffered.promise;
}

子控制器:

.controller('shareCtrl', function($scope){
    $scope.layout.toggleStatusSuggestion = function(){
         $scope.model.getRandomStatus().then(function(data){
            console.log(data);//logs out the correct text
            //$scope.model.formData.shareStatus = data;//also tried this, no luck
            return data.message;
         });
    $scope.model.formData.shareStatus = $scope.layout.toggleStatusSuggestion();//Newly edited
    }
});

HTML:

<div class="shareContainer" data-ng-controller="shareCtrl">
 <textarea class="textAreaExtend" name="shareStatus" data-ng-model="model.formData.shareStatus" data-ng-init="model.formData.shareStatus = layout.toggleStatusSuggestion()" cols="4"></textarea>
</div>

2 个答案:

答案 0 :(得分:2)

我相信你想要的是:

$scope.model.getRandomStatus().then(function(data){            
            $scope.model.formData.shareStatus = data.message;

});

then中返回一些内容并不会从包装它的函数中返回任何内容,因此不执行任何操作

答案 1 :(得分:0)

事实证明我有一个自定义验证指令正在通过$ formatters观察模型中的更改,并将其限制为80个字符(twitter),它默默地失败,因为我没想到会逐步插入无效值我的形式,非常愚蠢,但可能发生在任何人身上。 不得不对它进行一些修改,所以值得记住以防万一发生在其他任何人身上。