2013-04-26 3 views
0

Отказа от ответственности, что я новичок в angularjs :)

У меня есть контроллер, который делегирует к службе, и я пытаюсь сохранить $ рамку, так что я могу scope.apply после настройка свойств:

var Build = function($scope, $http, mango) { 
    var scope = $scope; 
    $scope.BuildManagerSubmit = function(selectedProfile) { 
     mango.buildMango(selectedProfile.def, function(profiledef) { 
      // bunch of property assignments on selectedProfile ... 
      scope.$apply(); 
     }, scope); 
    }; 
}; 
controllers.controller('Build', ['$scope', '$http', 'mango', Build]); 

Обратите внимание, что я использую закрытия, чтобы сохранить объем и передать его в службу (для краткости опускаем). Служба вызывает меня как cb.call (context, ...), поэтому я поддерживаю доступ к области. Это все работает нормально, но меня больше беспокоит, есть ли более совершенная идиома. Я не вижу много примеров поддержки $ scope при делегировании таким сервисам.

EDIT: это приложение использует узел-WebKit и сервис «манго» в основном взаимодействует с файловой системой, чтобы взывать к сценарию оболочки и т.д.

+0

Что такое doind mango.buildMango? есть угловые сервисы для автоматического управления таймаутом или XMLHttpRequest, поэтому вам не нужно делать такие вещи – Guillaume86

+0

Приложение использует узел-webkit, и эта служба манго взаимодействует с файловой системой – user2276815

+0

Хорошо, я бы вводил $ rootScope в службу манго и вызовите $ rootScope. $ apply() оттуда. Вам не нужно больше беспокоиться об этом, когда после этого вы будете использовать манго-сервис в других местах. – Guillaume86

ответ

0

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

var Build = function($scope, $http, mango) { 
    $scope.BuildManagerSubmit = function(selectedProfile) { 
     selectedProfile.profileDef = mango.buildMango(selectedProfile.def); 

     // do something when profileDef returned? (not always necessary) 
     selectedProfile.profileDef.then(function(profileDef) { 

     }); 
    }; 
}; 
controllers.controller('Build', ['$scope', '$http', 'mango', Build]); 
+0

Но разве служба не отвечает за выполнение заданий выбранных свойствProfile (прежде чем вызывать $ rootScope.apply()), так как именно поэтому мы обращались с предложением в первую очередь? Я не уверен, что я доволен добавлением ответственности за привязку к сервису, который не несет ответственности за обертку команд оболочки. – user2276815

+0

Вы не говорите своей службе о привязках, вы сообщаете своей службе, чтобы уведомить угловую область, которая могла бы измениться, любая работа, выполняющая асинхронную работу вне углового, должна это сделать. Задания (если это необходимо, не уверенный в этом, угловая ручка обещает прозрачно, поэтому вам это обычно не требуется), было бы сделано в 'prom.then', как я предложил в коде – Guillaume86