AngularJS $ অবস্থান পথ পরিবর্তন করছে না


126

কোনও ফর্ম জমা দেওয়ার পরে পৃষ্ঠার ইউআরএল পরিবর্তন করার সাথে আমার সমস্যা হচ্ছে।

আমার অ্যাপ্লিকেশনটির প্রবাহ এখানে:

  1. রুট সেট করা আছে, কিছু ফর্ম পৃষ্ঠায় ইউআরএল স্বীকৃত।
  2. পৃষ্ঠা লোড, নিয়ামক পরিবর্তনশীল সেট করে, নির্দেশিকা বরখাস্ত করা হয়।
  3. একটি বিশেষ ফর্মের নির্দেশিকা বরখাস্ত করা হয় যা এজেএক্স ব্যবহার করে একটি বিশেষ ফর্ম জমা দেয়।
  4. এজেএক্স সম্পাদন করার পরে (কৌণিক এজেএক্সের যত্ন নেয় না) তারপরে একটি কলব্যাক চালিত হয় এবং নির্দেশটি সেই $scope.onAfterSubmitফাংশনটিকে কল করে যা অবস্থান নির্ধারণ করে।

সমস্যাটি হ'ল লোকেশনটি সেট করার পরে কিছুই হয় না। আমিও স্থানটির পরমকে সেট করার চেষ্টা করেছি /... না। আমিও ফর্মটি জমা না দেওয়ার চেষ্টা করেছি। কিছুই কাজ করে না।

কোডটি onAfterSubmitফাংশনে পৌঁছায় কিনা তা পরীক্ষা করে দেখেছি (যা এটি করে)।

আমার একমাত্র চিন্তা এই যে কোনওভাবে ফাংশনের সুযোগ পরিবর্তন করা হয়েছে (যেহেতু এটি একটি নির্দেশিকা থেকে বলা হয়েছিল), তবে আবার onAfterSubmitসুযোগটি পরিবর্তিত হলে কীভাবে এটি কল করতে পারে ?

আমার কোড এখানে

var Ctrl = function($scope, $location, $http) {
  $http.get('/resources/' + $params.id + '/edit.json').success(function(data) {
    $scope.resource = data;
  });

  $scope.onAfterSubmit = function() {
    $location.path('/').replace();
  };
}
Ctrl.$inject = ['$scope','$location','$http'];

কেউ আমাকে সাহায্য করতে পারেন দয়া করে?



মনে রাখবেন যে এটি তৈরির আগে এটির এক বছর আগে।
matsko

ডান এবং অতিরিক্ত বছরের উপকারের সাথে, অন্যটির কাছে আরও সঠিকভাবে স্বীকৃত উত্তর রয়েছে।
জিম জি

1
@JimG। এটি কোনও সদৃশ নয়, এই প্রশ্নটি 4 বছর পূর্বে, আপনি যা লিঙ্ক করেছেন, এটি 2 বছর আগের।
ক্যাস্ত্রো রায়

উত্তর:


298

কিছুদিন আগেও আমার একইরকম সমস্যা হয়েছিল। আমার ক্ষেত্রে সমস্যাটি হ'ল আমি একটি তৃতীয় পক্ষের লাইব্রেরির সাথে জিনিসগুলি পরিবর্তন করেছি (সুনির্দিষ্ট হওয়ার জন্য jQuery) এবং এই ক্ষেত্রে ফাংশনগুলিতে কল করা এবং পরিবর্তনশীল কাজগুলি সেট করা হলেও কৌনিক সবসময় স্বীকৃতি দেয় না যে এইভাবে পরিবর্তনগুলি হজম হয় না।

$ প্রয়োগ () কৌণিক কাঠামোর বাইরে থেকে কৌণিক মধ্যে একটি এক্সপ্রেশন চালানো ব্যবহার করা হয়। (উদাহরণস্বরূপ ব্রাউজার ডিওএম ইভেন্টগুলি থেকে সেটটাইমআউট, এক্সএইচআর বা তৃতীয় পক্ষের লাইব্রেরি)।

$scope.$apply()আপনি অবস্থান পরিবর্তন করেছেন এবং replace()অ্যাঙ্গুলারকে জানান যে জিনিসগুলি পরিবর্তিত হয়েছে তার ঠিক পরে ব্যবহার করার চেষ্টা করুন ।


1
একটি যাদুমন্ত্র মত কাজ করে. আমি আপনার পোস্টে কোডটি ব্যবহার করেছি এটি কার্যকর করার জন্য :) আপনাকে অনেক ধন্যবাদ !!!
মাতস্কো

4
কীভাবে with
প্রয়োগটি

2
@ স্কিটার আপনি কেবল মূল স্কোপটি ইনজেক্ট করতে পারেন এবং এর মতো এটি পরিচালনা করতে পারেন: কারখানা ('xyz', ['$ রুটস্কোপ', ফাংশন ($ রুটস্কোপ) {...}])
এফ লেকসস

4
আপনার
কলব্যাকটি

7
জেসনস যেমন বলেছেন, $ টাইমআউট (ফাংশন () {// এখানে পরিবর্তন প্রয়োগ করুন use) ব্যবহার করুন; এর দুটি সুবিধা রয়েছে: 1) আপনার $ সুযোগ অ্যাক্সেসের প্রয়োজন নেই। 2) আপনার সম্পর্কে চিন্তা করতে হবে না al অ্যালরেডি চলমান প্রয়োগ করুন। ২ য় কারণে, $ টাইমআউট ব্যবহার করা প্রায়শই পছন্দের পদ্ধতির।
আর্নেহুগো

56

$location.path(...)পৃষ্ঠাটি পরিবর্তন বা রিফ্রেশ করার পরিবর্তে আমি পরিষেবাটি ব্যবহার করেছি $window। কৌণিকভাবে এই পরিষেবাটি windowবস্তুর ইন্টারফেস হিসাবে ব্যবহৃত হয় এবং windowঅবজেক্টটিতে এমন একটি সম্পত্তি রয়েছে locationযা আপনাকে অবস্থান বা URL স্টাফের সাথে সম্পর্কিত ক্রিয়াকলাপগুলি পরিচালনা করতে সক্ষম করে।

উদাহরণস্বরূপ, এর সাহায্যে window.locationআপনি একটি নতুন পৃষ্ঠা নির্ধারণ করতে পারেন:

$window.location.assign('/');

বা এটিকে রিফ্রেশ করুন:

$window.location.reload();

এটা আমার জন্য কাজ করেছে। এটি আপনার প্রত্যাশার থেকে কিছুটা আলাদা তবে প্রদত্ত লক্ষ্যটির জন্য কাজ করে।


3
আমিও, l লোকেশন.পাথ () ইউআরএল-এর প্যারাম থাকলে পুনঃনির্দেশ দেয় না
সুধাকর

2
এটা সঠিক উত্তর. দেখুন এখানে
আরভিং

28

আমারও একই সমস্যা ছিল, তবে $ লোকেশনে আমার কলটি ডাইজেস্টের মধ্যে আগেই ছিল। কল করা $ প্রয়োগ () ইতিমধ্যে প্রক্রিয়া ত্রুটিতে একটি $ ডাইজেস্ট দিয়েছে।

এই কৌশলটি কাজ করেছে (এবং $locationআপনার নিয়ামকের মধ্যে ইনজেকশন নিশ্চিত করুন ):

$timeout(function(){ 
   $location...
},1);

যদিও কেন এটি প্রয়োজনীয় ছিল সে সম্পর্কে কোনও ধারণা নেই ...


5
নুও এটি একটি খারাপ ধারণা। এটি একটি ডাইজেস্টের মধ্যে পর্যায়ের ইনসেসের জন্য পরীক্ষা করুন এবং তারপরে আপনি প্রয়োগটি এড়িয়ে যেতে পারেন। কৌণিক এটির সাথে যোগাযোগ করবে এবং নিজস্ব URL টি পরিবর্তন করবে: কোডারওয়াল.com
p

3
সময়সীমা আমার কাছে একটি নোংরা হ্যাকের মতো মনে হয়। যদি আপনার href "#" থাকে তবে। লোকেশন.পাথ () প্রত্যাশার মতো কাজ করে না। আপনার ট্যাগে কেবল href = "#" মুছে ফেলুন বা কেবল href = "" এ সেট করুন এবং আপনাকে $ সময়সীমা ব্যবহার করতে হবে না
শঙ্কর এআরুল - jupyterdata.com

7
$$ পর্যায়টি একটি প্রাইভেট ভেরিয়েবল যা আপনার অ্যাক্সেস করার চেষ্টা করা উচিত নয় কারণ এটি কোনও নতুন কৌণিক ভার্সনে পরিবর্তন হতে পারে।
ব্লেইস

7
$ টাইমআউট ব্যবহার করা হ্যাক হতে পারে তবে $$ পর্বটি ব্যবহার করা আরও বড় হ্যাক। সাধারণত, $$ এর উপসর্গযুক্ত কিছু দেখতে বা স্পর্শ করবেন না $$
নীলস্কেপ

3
প্রায় 10 ঘন্টা এলোমেলো জিনিস ভাঙার পরে ... এই সমাধানটি আমার পক্ষে কাজ করেছে!
শাকিল 21

6

আমাকে আমার $location.path()বিবৃতিটি এম্বেড করতে হয়েছিল কারণ আমার ডাইজেস্ট এখনও চলছে:

       function routeMe(data) {                
            var waitForRender = function () {
                if ($http.pendingRequests.length > 0) {
                    $timeout(waitForRender);
                } else {
                    $location.path(data);
                }
            };
            $timeout(waitForRender);
        }

1
খুব কার্যকর এই কাজের জন্য ধন্যবাদ!
বিল এফিন মারে

আমার জন্য সমস্যা হ'ল আমরা কৌনিক-ব্লক-ইউআই ব্যবহার করছিলাম এবং এটি অ্যাড্রেস বারের অবস্থানের আপডেটটি আটকাচ্ছিল। আমরা আমাদের অনুরোধ ফিল্টারটি যে অনুরূপ কলটিতে ব্লক-ইউআই ট্রিগার না করে তার জন্য একটি বিলের সাথে $ http অনুরোধটি সজ্জিত করেছি এবং তারপরে সবকিছু ঠিক আছে।
মাতানো

2

আমার ক্ষেত্রে, সমস্যাটি ছিল আমার টেম্পলেট কনফিগারেশনে alচ্ছিক প্যারামিটার সূচক ('?') অনুপস্থিত।

উদাহরণ স্বরূপ:

.when('/abc/:id?', {
    templateUrl: 'views/abc.html',
    controller: 'abcControl'
})


$location.path('/abc');

জিজ্ঞাসাবাদ চরিত্র ছাড়া রুট স্পষ্টতই রুট পরামিতি দমন পরিবর্তন হবে না।


এটি টেমপ্লেট কনফিগারেশন নয় রুট কনফিগারেশন।
পাইওটর ডব্রোগোস্ট

1

যদি আপনারা কেউ অ্যাংুলার-ইউআই / ইউআই-রাউটার ব্যবহার করেন তবে এর $state.go('yourstate')পরিবর্তে : ব্যবহার করুন $location। এটা আমার জন্য কৌতুক করেছে।


0

এটি আমার জন্য খারাপ (কফিস্ক্রিপ্টে)

 $location.path '/url/path'
 $scope.$apply() if (!$scope.$$phase)

0

আমার মতে এখানে অনেক উত্তর কিছুটা হ্যাকি মনে হয় (যেমন $ প্রয়োগ () বা $ টাইমআউট), যেহেতু $ প্রয়োগ () দিয়ে গন্ডগোল করার ফলে অবাঞ্ছিত ত্রুটি হতে পারে।

সাধারণত, যখন $ অবস্থানটি কাজ করে না তার অর্থ এই যে কোনও কিছুটি কৌণিকভাবে কার্যকর করা হয়নি।

এই বিশেষ প্রশ্নে, সমস্যাটি অ-কৌণিক এজেএক্স অংশে বলে মনে হচ্ছে। আমার একটি অবিশ্বাস্য সমস্যা ছিল, যেখানে প্রতিশ্রুতি সমাধানের পরে ire অবস্থান ব্যবহার করে পুনঃনির্দেশটি হওয়া উচিত। আমি এই উদাহরণটিতে সমস্যাটি বর্ণনা করতে চাই।

পুরানো কোড:

taskService.createTask(data).then(function(code){
            $location.path("task/" + code);
        }, function(error){});

দ্রষ্টব্য: টাস্ক সার্ভিস.ক্রেটটাস্ক একটি প্রতিশ্রুতি দেয়।

$ কিউ - প্রতিশ্রুতি ব্যবহার করার কৌণিক উপায়:

let dataPromises = [taskService.createTask(data)];
        $q.all(dataPromises).then(function(response) {
                let code = response[0];
                $location.path("task/" + code);
            }, 
            function(error){});

প্রতিশ্রুতি সমাধানের জন্য $ q ব্যবহার করে পুনঃনির্দেশ সমস্যার সমাধান হয়েছে।

$ কিউ পরিষেবাতে আরও: https://docs.angularjs.org/api/ng/service/ $ q


-8
setTimeout(function() { $location.path("/abc"); },0);

এটি আপনার সমস্যার সমাধান করা উচিত।


1
অ-সেটটাইমআউট চালানো খুব খারাপ ধারণা। এবং যেমন @ ম্যাসটকো উপরে বলেছে, $ টাইমআউট সেরা ধারণা নয়।
গঞ্জোফিশ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.