2013-11-12 4 views
1

Я попытался вырезать детали и сделать это достаточно обобщенно ...Binding Угловое Услугу Scope терпит неудачу после 1.2 обновления

Использование 1.2 RC2 мой код работал нормально, после обновления до 1,2 стабильной и коррекции $ parse changes Я столкнулся с проблемой привязки. Перед обновлением следующий код работал без каких-либо проблем. updateChildObject() вызывается со страницы html.

.when('/the-page/', { 
    controller: function($scope, serviceResults, FactoryService) { 
    $scope.object.childObject = serviceResults; 

    // this function used to work. Now assigns the function to the 
    // scope rather than the results 
    $scope.updateChildObject = function(args) { 
     $scope.object.childObject = FactoryService.getSomethingFromServer(args); 
    }; 

    }, 
    resolve: { 
    serviceResults: function(FactoryService) { 
     return FactoryService.getSomethingFromServer(args); 
    } 
    } 

Поскольку это не удается сейчас ($ scope.object.childObject появляется, чтобы установить в качестве функции, а не результаты) Я считаю, что подходящий способ решить эту проблему через обещание. (Обратите внимание, что сама услуга успешно использует обещание.) Тем не менее, я испытываю трудности с обновлением $ scope, когда обещание будет разрешено.

Я считаю, что следующий код находится по правильному пути. $ q вводится в контроллер.

... 
$scope.updateChildObject = function(args) { 
    var defer = $q.defer(); 
    defer.promise.then(function() { 
    return FactoryService.getSomethingFromServer(args); 
    }); 
    $scope.object.childObject = defer.resolve(); 
}; 
... 

Так может ли кто-нибудь сказать мне, что я здесь делаю неправильно? Обещания - это лишь одна из тех вещей, которые пока еще не на меня надавили.

ответ

2

Как альтернатива вашему ответу: вы говорите, что FactoryService уже успешно использует обещание, и в этом случае вам кажется, что вам не нужно дополнительное обещание в updateChildObject. Вы можете обновить FactoryService.getSomethingFromServer(args) вернуть обещание (т.е. с return defer.promise; в конце и defer.resolve(results); в бите асинхронной), а затем упростите updateChildObject просто:

$scope.updateChildObject = function(args) { 
    FactoryService.getSomethingFromServer(args).then(function(results) { 
    $scope.object.childObject = results; 
    } 
}; 

Кроме того, стоит знать, что Угловая 1,2 намеренно нарушает автоматическое обещание разворачивание это было в более ранних версиях: https://github.com/angular/angular.js/issues/4158. Он имел обыкновение быть так, что этот код

$scope.updateChildObject = function(args) { 
    $scope.object.childObject = FactoryService.getSomethingFromServer(args); 
}; 

будет работать идентично тому, выше (при условии, getSomethingFromServer возвращает обещание), но не больше. Возможно, это проблема, с которой вы столкнулись. 1.2

+1

А человек, спасибо за отзыв. Понятия не имею, что я мог бы использовать мое обслуживание. Действительно полезно. Таким образом, обе версии работают одинаково. Ваша модель устраняет необходимость впрыскивания $ q, которое мне нравится. Вы правы, хотя автоматическое разворачивание было именно тем, к чему я работал. – iamsar

0

Выяснено, что я делаю неправильно. Определенно была проблема обещания в том, что я просто не использовал их правильно. Следующие решения были решены:

... 
$scope.updateChildObject = function(args) { 
    var defer = $q.defer(); 
    defer.promise.then(function(results) { 
     $scope.object.childObject = results; 
    }); 
    defer.resolve(FactoryService.getSomethingFromServer(args)); 
}; 
... 

Таким образом, defer.resolve вызывает то, что должно быть разрешено. Пообещать. then() передает результаты следующему действию. Так просто.

Смежные вопросы