2015-04-25 5 views
3

Я использую ионный фреймворк и должен иметь возможность вызывать всплывающее окно из нескольких мест в моем коде, поэтому я думал, что переведу его на завод. Всплывающее окно использует поле ввода, и я хочу получить его значение. Обычно я просто звоню $scope.parentGate.answer, но потому, что на фабрике у меня нет доступа к области. Любые идеи, как я могу получить значение поля ввода?Область доступа внутри угловой фабрики js

Вот мой код:

angular.module('starter.services', []) 
.factory('parentGate', function ($ionicPopup, Helpers) { 
    return { 
     Show: function(scope, SuccessCallback) { 
      var first = Helpers.RandomNumber(1, 5) * 10; 
      var second = Helpers.RandomNumber(11, 22); 
      var title = 'What does ' + first + ' + ' + second + ' equal?' 
      // An elaborate, custom popup 
      return $ionicPopup.show({ 
       template: '<h4 class="text-center">' + title + '</h4><div class="list"><label class="item item-input"><input type="number" ng-model="parentGate.answer" placeholder="Answer..."></label></div>', 
       title: "Parent Gate", 
       //subTitle: title, 
       scope: scope, 
       buttons: [ 
        { text: 'Cancel' }, 
        { 
        text: 'Continue', 
        type: 'button-positive', 
        onTap: function(e) { 

         // 
         // I can't access $scope.parentGate.answer here. 
         // How else can I do it? 
         // 
         if ($scope.parentGate.answer == first + second) { 

         console.log("correct"); 
         SuccessCallback(); 
         } else { 
         console.log("wrong!"); 
         e.preventDefault(); 
         } 
        } 
        } 
       ] 
      }); 
     } 
    }; 
}); 
+0

Пожалуйста, не обращайтесь в область видимости внутри службы. – pixelbits

ответ

10

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

Кажется, вы хотите использовать фабрику, чтобы открыть диалог.

Я думаю, в вашем случае, вы будете передать вам объем в качестве параметра, когда и попытаться вызвать

angular.module("yourApp").controller("testController", function($scope, parentGate){ 
    parentGate.show($scope, callback); 
}); 

И в вашей фабрике, когда вы пытаетесь изменить значение свойства при $ объеме (OnTap обратного вызова) вы должны использовать scope, не$scope

onTap: function(e) { 
    //if ($scope.parentGate.answer == first + second) { 
    if (scope.parentGate.answer == first + second) { 
     console.log("correct"); 
     SuccessCallback(); 
    } else { 
     console.log("wrong!"); 
     e.preventDefault(); 
    } 
} 

Here is the demo code.
Here is the reason why we want to change $scope to scope in your onTap callback (Demo Closu re)

Надеюсь, что это сработает. :)

+0

Я был рядом. :) Спасибо за помощь. –

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