बाहरी जेएस फ़ंक्शन से AngularJS एक्सेस स्कोप


Answers

यह कुछ समय हो गया है क्योंकि मैंने इस प्रश्न को पोस्ट किया है, लेकिन विचारों पर विचार करने के लिए यह अभी भी लगता है, पिछले कुछ महीनों के दौरान मैं एक और समाधान आया हूं:

$scope.safeApply = function( fn ) {
    var phase = this.$root.$$phase;
    if(phase == '$apply' || phase == '$digest') {
        if(fn) {
            fn();
        }
    } else {
        this.$apply(fn);
    }
};

उपर्युक्त कोड मूल रूप से सुरक्षित क्रिया नामक एक फ़ंक्शन बनाता है जो $apply फ़ंक्शन (जैसा कि अरुण के उत्तर में बताया गया है) को कॉल safeApply है यदि केवल और केवल कोणीय $digest चरण से नहीं जा रहा है । दूसरी तरफ, यदि कोणीय वर्तमान में चीजों को पचाने वाला है, तो यह केवल कार्य को निष्पादित करेगा, क्योंकि यह परिवर्तन करने के लिए कोणीय को संकेत देने के लिए पर्याप्त होगा।

एंगुलरजेस वर्तमान में $digest चरण में है, जबकि $apply फ़ंक्शन का उपयोग करने का प्रयास करते समय कई त्रुटियां होती हैं। उपरोक्त सुरक्षित safeApply कोड ऐसी त्रुटियों को रोकने के लिए एक सुरक्षित रैपर है।

(ध्यान दें: मैं व्यक्तिगत रूप से safeApply रूप से safeApply पसंद करता $rootScope सुविधा उद्देश्यों के लिए $rootScope एक समारोह के रूप में)

उदाहरण:

function change() {
    alert("a");
    var scope = angular.element($("#outer")).scope();
    scope.safeApply(function(){
        scope.msg = 'Superhero';
    })
}

डेमो: http://jsfiddle.net/sXkjc/227/

Question

मैं यह देखने की कोशिश कर रहा हूं कि बाहरी जावास्क्रिप्ट फ़ंक्शन (लक्ष्य नियंत्रक के लिए पूरी तरह से अप्रासंगिक) के माध्यम से नियंत्रक के आंतरिक दायरे तक पहुंचने का कोई आसान तरीका है या नहीं

मैंने यहां कुछ अन्य प्रश्नों पर देखा है

angular.element("#scope").scope();

एक डीओएम तत्व से दायरे को पुनः प्राप्त करेगा, लेकिन मेरे प्रयास वर्तमान में कोई उचित परिणाम नहीं दे रहे हैं।

यहां jsfiddle है: http://jsfiddle.net/sXkjc/5/

मैं वर्तमान में सादा जेएस से कोणीय में एक संक्रमण के माध्यम से जा रहा हूँ। मुख्य कारण यह है कि मैं इसे प्राप्त करने की कोशिश कर रहा हूं, मेरा मूल लाइब्रेरी कोड जितना संभव हो उतना बरकरार रखना है; नियंत्रक को प्रत्येक समारोह जोड़ने के लिए मुझे आवश्यकता की बचत।

इस बारे में कोई विचार है कि मैं इसे प्राप्त करने के बारे में कैसे जा सकता हूं? उपरोक्त पहेली पर टिप्पणियां भी स्वागत है।




<input type="text" class="form-control timepicker2" ng-model='programRow.StationAuxiliaryTime.ST88' />

दायरा मूल्य का उपयोग करना

मान लें कि प्रोग्राम Row.StationAuxiliaryTime ऑब्जेक्ट की एक सरणी है

 $('.timepicker2').on('click', function () 
    {
            var currentElement = $(this);

            var scopeValues = angular.element(currentElement).scope();
            var model = currentElement.attr('ng-model');
            var stationNumber = model.split('.')[2];
            var val = '';
            if (model.indexOf("StationWaterTime") > 0) {
                val = scopeValues.programRow.StationWaterTime[stationNumber];
            }
            else {
                val = scopeValues.programRow.StationAuxiliaryTime[stationNumber];
            }
            currentElement.timepicker('setTime', val);
        });



ऐसा करने का एक और तरीका है:

var extScope;
var app = angular.module('myApp', []);
app.controller('myController',function($scope, $http){
    extScope = $scope;
})
//below you do what you want to do with $scope as extScope
extScope.$apply(function(){
    extScope.test = 'Hello world';
})



यहां एक पुन: प्रयोज्य समाधान है: http://jsfiddle.net/flobar/r28b0gmq/

function accessScope(node, func) {
    var scope = angular.element(document.querySelector(node)).scope();
    scope.$apply(func);
}

window.onload = function () {

    accessScope('#outer', function (scope) {
        // change any property inside the scope
        scope.name = 'John';
        scope.sname = 'Doe';
        scope.msg = 'Superhero';
    });

};



स्वीकृत उत्तर बहुत अच्छा है। मैं देखना चाहता था कि ng-repeat के संदर्भ में कोणीय दायरे के साथ क्या होता है। बात यह है कि, कोणीय प्रत्येक दोहराए गए आइटम के लिए एक उप-स्कोप बनाएगा। मूल $scope पर परिभाषित विधि में कॉल करते समय, यह मूल मूल्य (जावास्क्रिप्ट बंद होने के कारण) को बरकरार रखता है। हालांकि, this कॉलिंग स्कोप / ऑब्जेक्ट को संदर्भित करता है। यह अच्छी तरह से काम करता है, जब तक आप $scope पर स्पष्ट हो जाते हैं और this वही होते हैं और जब वे अलग होते हैं। hth

यहां एक पहेली है जो अंतर को दर्शाती है: https://jsfiddle.net/creitzel/oxsxjcyc/




Links