2017-01-06 5 views
1

Услуги:AngularJS Service Передача Значение

app.factory("MessageService", ["$timeout", function($timeout) { 
    return function(message) { 

    $timeout(function() { 
     // $scope.fadeMessageSuccess = true; 
     console.log("Test"); 
    }, 2000); 

    return message; 
    } 
}]); 

код в контроллере:

var message = { 
     type: "success", 
     title: "Message Title", 
     content: "Message Content" 
    } 
$scope.model = MessageService(message); 

Вид:

<div ng-controller="AccountCtrl" ng-cloak=""> 
    <div class="ui {{model.type}} message message-overwrite" 
     ng-class="{'fade': fadeMessageSuccess} "> 
    <i class="close icon"></i> 
    <div class="header"> 
     {{model.title}} 
    </div> 
    <p>{{model.content}}</p> 
    </div> 
</div> 

В принципе, я пытаюсь выяснить, как передать значение от true до $scope.fadeMessageSuccess внутри контроллера. Поскольку вы не можете использовать $ scope внутри службы, я не совсем уверен, как перейти к передаче значения внутри функции $timeout.

ответ

0

Служба не очень полезна: она принимает значение в качестве аргумента и возвращает это значение.

Чтобы выполнить некоторый код после некоторой задержки, оберните этот код в функцию и передайте его $timeout() или передайте его методу .then() обещания, возвращенного $timeout().

$timeout(function() { 
    $scope.fadeMessageSuccess = true; 
}, 2000); 

Или

$timeout(angular.noop, 2000).then(function() { 
    $scope.fadeMessageSuccess = true; 
}); 

Если вы действительно хотите, чтобы скрыть $ таймаут в свою собственную службу, а затем сделать службу принимают функцию обратного вызова так же, как $ таймаут делает, или вернуть обещание возвращаемого функцией звоните в $ таймаута(), так что контроллер может позвонить then() по этому возвращенного обещание:

app.factory("MessageService", ["$timeout", function($timeout) { 
    return function(callback) { 
    $timeout(callback, 2000); 
    } 
}]); 

... 

MessageService(function() { 
    $scope.fadeMessageSuccess = true; 
}); 

или

app.factory("MessageService", ["$timeout", function($timeout) { 
    return function() { 
    return $timeout(angular.noop, 2000); 
    } 
}]); 

... 

MessageService().then(function() { 
    $scope.fadeMessageSuccess = true; 
}); 
+0

Этот полпути работает. Тайм-аут работает правильно, но он передает значения «сообщения» с тайм-аутом 2000 мс. Мне нужно, чтобы значения передавались мгновенно, а $ scope.fadeMessageSuccess = true - единственная часть с таймаутом. –

+0

Я понятия не имею, что вы делаете с сообщением. У меня нет никакого сообщения в моем ответе, потому что я не понял точку передачи сообщения службе, которая вернет ее немедленно. Объясните, чего вы хотите достичь. –

+0

Я хочу передать тип, заголовок и содержимое прямо в область $ scope, а затем через 2 секунды вызвать fadeMessageSuccess. –