অ্যাঙ্গুলারজ, রুটের মধ্য দিয়ে ক্ষণস্থায়ী পাস


87

আমার একটি ফর্মের সাথে একটি পরিস্থিতি রয়েছে যা বেশ কয়েকটি পৃষ্ঠায় ছড়িয়ে পড়েছে (আদর্শ হতে পারে না তবে এটি এমন।) আমি পুরো ফর্মের জন্য একটি সুযোগ থাকতে চাই যা আপনি বরাবর যেতে যেতে ভরাট হয়ে যায়, যাতে ব্যবহারকারীর যদি পদক্ষেপের মাঝে পিছনে চলে যায় তবে রাষ্ট্রের কথা মনে রাখা সহজ।

সুতরাং আমাকে খুব সিউডো কোডে করতে হবে:

  1. সেট $scope.val = <Some dynamic data>
  2. একটি লিঙ্কে ক্লিক করুন এবং একটি নতুন টেম্পলেট (সম্ভবত একই নিয়ামক সহ) যেতে হবে be
  3. $scope.val এখনও শেষ পৃষ্ঠায় যেমন ছিল তেমন মান হওয়া উচিত।

কোনওভাবেই সুযোগটির জন্য ডেটা বজায় রাখা সঠিক উপায় এটি সম্পর্কে, বা অন্য কোনও উপায় আছে? এমনকি আপনি এমন কোনও নিয়ামক তৈরি করতে পারেন যা অবশ্যই কোনও ডাটাবেসে এটি সংরক্ষণ ব্যতীত রুটের মধ্যে স্থির থাকতে পারে।


গণরাজের সাথে যুক্ত হিসাবে: এখানে আপনি কীভাবে বিভিন্ন কন্ট্রোলারকে যোগাযোগ করতে পারেন সে সম্পর্কে একটি স্ক্রিনকাস্ট সহ একটি দুর্দান্ত ব্লগ এন্ট্রি পাবেন। এর সাথে চারপাশে খেলতে বেশ কয়েকটি সহায়ক jsfiddles রয়েছে। onehungrymind.com/angularjs- কম্যুনিকেটিং-বিটিউন- কনট্রোলাররা আশা করি এটি সাহায্য করবে।
এফ লেকচাস

উত্তর:


138

আপনার পরিষেবাটি ব্যবহার করা দরকার যেহেতু কোনও অ্যাপ্লিকেশন আপনার অ্যাপ্লিকেশনর জীবন জুড়ে থাকবে।

বলুন আপনি কোনও ব্যবহারকারীর সাথে সম্পর্কিত ডেটা সংরক্ষণ করতে চান

আপনি পরিষেবাটি এইভাবে সংজ্ঞায়িত করেন:

app.factory("user",function(){
        return {};
});

আপনার প্রথম নিয়ামক মধ্যে:

app.controller( "RegistrationPage1Controller",function($scope,user){
    $scope.user = user;
    // and then set values on the object
    $scope.user.firstname = "John";
    $scope.user.secondname = "Smith";
});

app.controller( "RegistrationSecondPageController",function($scope,user){
        $scope.user = user;
        // and then set values on the object
        $scope.user.address = "1, Mars";

    });

6
আহ! আমি এটির আগে চেষ্টা করেছি কিন্তু এটি কাজ করতে পেলাম না কারণ আমি উভয় রুটের জন্য একই নিয়ামক ব্যবহার করেছি, সুতরাং প্রতিটি নতুন রুটে ডিফল্ট মানগুলি পূর্ববর্তী পৃষ্ঠায় আমি যেটি লিখেছি সেগুলি ওভার-লিখন করে। দুটি নিয়ামক সহ, বা কোনও ডিফল্ট মান ছাড়াই, এটি আর হয় না। ধন্যবাদ!
এরিক হ্ন

4
Value Recipe ডকস.আঙ্গুলারজেএস.আর / গাইড / প্রোভাইডারগুলি কী , সেগুলিও কি myApp.value('clientId', 'a12345654321x');রুটগুলির মধ্যে স্থির থাকে?
বেন্ডার

@ দ্য ব্যাণ্ডার: এটি হওয়া উচিত। মূল্যবোধগুলি পরিষেবার একটি বিশেষ রূপ যা আমি এটি বুঝতে পারি।
রবার্ট কোরিটনিক

4
আপনি পৃষ্ঠাটি পুনরায় লোড করলে পরিষেবাগুলি ডেটা ধরে রাখে না ... সুতরাং আপনি যদি নিজের ফর্মের ৪ পৃষ্ঠায় থাকেন এবং সেই পৃষ্ঠাটি পুনরায় লোড করেন তবে আপনি সমস্ত ভরাট ডেটা আলগা করবেন।
danielrvt

4
চমৎকার উত্তর! সাইড পয়েন্ট হিসাবে, এই উত্তরটি গ্রহণকারীদের জন্য একটি স্টাইল গাইড - সেবার যেগুলি নিজেরাই নির্মাণকারী নয় (যেমন নতুন এক্সএক্স হিসাবে ব্যবহৃত হয়) নামগুলি ছোট হাতের উটের নামকরণ করা উচিত: github.com/mgechev/angularjs-style-guide
ম্যাট বাইর্ন

9

পরিষেবাটি কাজ করবে, তবে কেবল সাধারণ স্কোপ এবং নিয়ন্ত্রক ব্যবহার করে এটি করার একটি যৌক্তিক উপায় হ'ল আপনার নিয়ামক এবং উপাদানগুলি সেটআপ করা যাতে এটি আপনার মডেলের কাঠামোকে প্রতিফলিত করে। বিশেষত, আপনার একটি পিতামাতার উপাদান এবং নিয়ামক প্রয়োজন যা একটি পিতামাতাদের স্কোপ স্থাপন করে। ফর্মের পৃথক পৃষ্ঠাগুলি এমন দৃষ্টিতে থাকা উচিত যা পিতামাতার কাছে একটি শিশু child সন্তানের দর্শন আপডেট হওয়া সত্ত্বেও পিতামাতাদের স্কোপটি বজায় থাকে।

আমি ধরে নিয়েছি আপনি ইউআই-রাউটার ব্যবহার করছেন যাতে আপনি নেস্টেড মতামত দেখতে পারেন। তারপরে সিউডো কোডে:

<div ng-controller="WizardController">
  <div name="stepView" ui-view/>
</div>

তারপরে উইজার্ডকন্ট্রোলার এমন স্কোপ ভেরিয়েবলগুলি সংজ্ঞায়িত করে যা আপনি বহু-পৃষ্ঠার ফর্মের পদক্ষেপগুলি জুড়ে সংরক্ষণ করতে চান (যা আমি "উইজার্ড" হিসাবে উল্লেখ করছি)। তারপরে আপনার রুটগুলি কেবল আপডেট হবে stepView। প্রতিটি পদক্ষেপের নিজস্ব টেম্পলেট, নিয়ামক এবং স্কোপ থাকতে পারে তবে তাদের স্কোপগুলি পৃষ্ঠা থেকে অন্য পৃষ্ঠায় হারিয়ে গেছে। তবে উইজার্ডকন্ট্রোলারের স্কোপগুলি সমস্ত পৃষ্ঠায় সংরক্ষণ করা হয়েছে।

শিশু নিয়ন্ত্রণকারীদের কাছ থেকে উইজার্ডকন্ট্রোলার স্কোপগুলি আপডেট করতে, আপনাকে প্রতিটি স্কোপ ভেরিয়েবলের জন্য উইজার্ডকন্ট্রোলারের মতো সিন্ট্যাক্স ব্যবহার $scope.$parent.myProp = 'value'করতে বা কোনও ফাংশন সংজ্ঞায়িত করতে হবে setMyProp। অন্যথায়, যদি আপনি সরাসরি শিশু নিয়ন্ত্রণকারীদের কাছ থেকে প্যারেন্ট স্কোপ ভেরিয়েবলগুলি সেট করার চেষ্টা করেন তবে আপনি কেবলমাত্র পিতা-মাতার ভেরিয়েবলকে ছায়াময় করে সন্তানের উপর একটি নতুন স্কোপ ভেরিয়েবল তৈরি করবেন।

খুব ধরণের ব্যাখ্যা করা এবং আমি পূর্ণ উদাহরণের অভাবের জন্য ক্ষমাপ্রার্থী। মূলত আপনি এমন একটি পিতা-মাতা নিয়ামক চান যা একটি পিতামাতার সুযোগকে প্রতিষ্ঠিত করে, যা আপনার ফর্মের সমস্ত পৃষ্ঠায় সংরক্ষণ করা হবে।


4
এটি ইউআই-রাউটারের সাথে হ্যাঁ কাজ করবে (এবং এটির মতো একটি পৃষ্ঠার নকশা করার জন্য এটি দুর্দান্ত উপায়) তবে বাক্সের বাইরে নয়। বাক্সের বাইরে পরিষেবা পদ্ধতিটি যাওয়ার উপায়।
এরিক হান

4
কেবল পরিষ্কার করতে, পিতা বা মাতা স্কোপ বৈশিষ্ট্যগুলি সর্বদা সন্তানের সুযোগ দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত হয়। তবে, আপনি যদি সন্তানের সুযোগ থেকে পিতামাতার স্কোপ সম্পত্তি সেট করতে চান তবে আপনার এটি পিতামাতার কাছে অ্যাক্সেস করা দরকার, অন্যথায় আপনি সন্তানের সুযোগে একই নামের একটি নতুন সম্পত্তি তৈরি করছেন। প্যারেন্ট স্কোপ প্রপার্টি সেট করে দেওয়া যায়:$scope.$parent.myProp = 'hello world';
এমবুরসিল

4
কোনও পরিষেবা ব্যবহারের চেয়ে এটি অনেক সুন্দর পদ্ধতি। পরিষেবাদিগুলি সিলেটলেট, সুতরাং কোনও রাষ্ট্র নির্ধারিত অ্যাপ্লিকেশনটিতে বৈশ্বিক। যদি ব্যবহারকারী উইজার্ডটিকে পার্ট ওয়ে দিয়ে বেরিয়ে যায়, তবে এটি আবার শুরু হবে, পূর্ববর্তী রান থেকে পরিষেবাটিতে বাম-ওভার স্টেট থাকবে - আপনি যদি নিশ্চিত হন না যে আপনি প্রতিটি প্রস্থান পয়েন্টে পরিষেবাটি সঠিকভাবে পরিষ্কার করেছেন, তবে এটি বেশ কার্যকর হতে পারে সহজেই যথেষ্ট রক্ষণাবেক্ষণ মাথা ব্যাথা হয়ে যায়!
ড্যান কিং

এই উত্তরটির জন্য আরও বেশি আগ্রহী
কুরাই বঙ্কুসু

আপনি কৌনিক ইউআই রাউটার ব্যবহার না করে থাকলে পরিষেবাগুলি সর্বপ্রথম মনে রাখবে। আপনি যদি ইউআই রাউটার ব্যবহার করেন তবে এটির সমাধানে নেস্টেড রয়েছে যা নেস্টেড ভিউগুলির মধ্যে তথ্য অবিচ্ছিন্ন রাখতে পারে। আমি মনে করি এটি পিতামাতার স্কোপ অ্যাক্সেস করার চেষ্টা করার চেয়ে একটি পরিষ্কার পদ্ধতির হবে। medium.com/opinionated-angularjs/...
losmescaleros

6

নিয়ন্ত্রণকারীদের মধ্যে ডেটা দুটি উপায়ে পাস করা যেতে পারে

  1. $rootScope
  2. মডেল

নীচের নমুনাটি মডেলটি ব্যবহার করে মানগুলি উত্তরণকে দেখায়

app.js

angular.module('testApp')
  .controller('Controller', Controller)
  .controller('ControllerTwo', ControllerTwo)
  .factory('SharedService', SharedService);

SharedService.js

function SharedService($rootScope){

 return{
    objA: "value1",
    objB: "value2"
  }
}

// নিয়ন্ত্রক এ মান পরিবর্তন করুন

Controller.js

function Controller($scope, SharedService){

 $scope.SharedService = SharedService;

 $scope.SharedService.objA = "value1 modified";
}

// নিয়ন্ত্রণকারীতে মান অ্যাক্সেস করুন

কন্ট্রোলার টু.জেএস

function ControllerTwo($scope, SharedService){

 $scope.SharedService = SharedService;

 console.log("$scope.SharedService.objA"+$scope.SharedService.objA); // Prints "value1 modified"
}

আশাকরি এটা সাহায্য করবে.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.