AngularJS - টেমপ্লেটটি তৈরির ক্ষেত্রে কীভাবে $ রুটপ্যারাম ব্যবহার করবেন?


96

আমাদের অ্যাপ্লিকেশনটিতে 2-স্তরের নেভিগেট রয়েছে। আমরা কোনটিতে $routeProviderটেমপ্লেটগুলি গতিশীলভাবে সরবরাহ করতে AngularJS ব্যবহার করতে চাই <ng-view />। আমি এর লাইনে কিছু করার কথা ভাবছিলাম:

angular.module('myApp', []).
config(['$routeProvider', function($routeProvider) {
    $routeProvider.when('/:primaryNav/:secondaryNav', {
        templateUrl: 'resources/angular/templates/nav/'+<<primaryNavHere>>+'/'+<<secondaryNavHere>>+'.html'
    });
}]);

আমি ঠিক জানি না কীভাবে অংশগুলির মধ্যে অংশগুলি স্থাপন করা যায় <<>>। আমি জানি প্রাথমিক ন্যাভ এবং সেকেন্ডারি নাভ $ রুটপ্যারামের সাথে আবদ্ধ, তবে কীভাবে আমি টেমপ্লেটটিকে গতিশীলভাবে পরিবেশন করতে এখানে $ রুটপ্যারামগুলিতে অ্যাক্সেস করব?

উত্তর:


84

আমি ইনজেকশন এবং $routeParamsপরিষেবাটি ব্যবহার করার কোনও উপায় খুঁজে পাইনি (যা আমি মনে করি এটি আরও ভাল সমাধান হবে) আমি এই চিন্তাভাবনাটি চেষ্টা করেছিলাম এটি কার্যকর হতে পারে:

angular.module('myApp', []).
    config(function ($routeProvider, $routeParams) {
        $routeProvider.when('/:primaryNav/:secondaryNav', {
            templateUrl: 'resources/angular/templates/nav/'+$routeParams.primaryNav+'/'+$routeParams.secondaryNav+'.html'
        });
    });

যা এই ত্রুটিটি পেয়েছিল:

অজানা প্রদানকারী: my রুটপ্যারামগুলি মাই অ্যাপ থেকে

যদি এর মতো কিছু সম্ভব না হয় আপনি templateUrlস্রেফ রয়েছে এমন একটি আংশিক এইচটিএমএল ফাইলের দিকে নির্দেশ করতে ng-includeএবং তারপরে $routeParamএই জাতীয় ব্যবহার করে আপনার নিয়ামকের URL টি সেট করতে পারেন:

angular.module('myApp', []).
    config(function ($routeProvider) {
        $routeProvider.when('/:primaryNav/:secondaryNav', {
            templateUrl: 'resources/angular/templates/nav/urlRouter.html',
            controller: 'RouteController'
        });
    });

function RouteController($scope, $routeParams) {
        $scope.templateUrl = 'resources/angular/templates/nav/'+$routeParams.primaryNav+'/'+$routeParams.secondaryNav+'.html';
    }

এই হিসাবে আপনার হিসাবে urlRouter.html

<div ng-include src="templateUrl"></div>

7
প্রাক্তনটি কেন কাজ করেন না তা হ'ল ডকুমেন্টেড গ্রুপগুলি google.com/forum/?fromgroups=#!topic/angular/qNi5lqm-Ps8 । যেহেতু config()কেবলমাত্র সরবরাহকারীদের ইনজেকশন লক্ষ্যগুলি উত্তীর্ণ হয়, প্রকৃত পরিষেবা উদাহরণ নয় $routePrams
nre

18
"TemplateUrl" এর পরিবর্তে কী এবং একটি স্ট্রিং এইচটিএমএল এক-লাইনের ;-) সম্বলিত এটি প্রদান: শুধু "টেমপ্লেট" ব্যবহার - তুমি আসলে "ওয়ান লাইন HTML ফাইল" তৈরি করতে হবে না
DominikGuzei

4
আপনি কেবল templateপরিবর্তে ব্যবহার করতে পারবেন না templateUrl?
কায়সার

4
এটি আসলে কাজ করবে, তবে নির্বাচিত প্রতিটি টেম্পলেটগুলির জন্য একটি নিয়ামক প্রয়োগ করার বিষয়ে কী হবে? "RouteController": এই পদ্ধতি ব্যবহার করে শুধুমাত্র একটি "মাস্টার" নিয়ামক সঙ্গে আপনি ছাড়বে
Yaniv Efraim

9
যদি আপনার সেট করা templateএকটি ফাংশন জন্য, আপনাকে প্রেরণ করতে পারেন $routeParamsযে ফাংশন মধ্যে: $routeProvider.when('/:pNav/:sNav', { template: fn($routeParams) { return $routeParams.pNav + '/' + $routeParams.sNav + '.html' } });। যাইহোক, আপনি এইভাবে কোনও নিয়ামককে গতিশীলভাবে সংজ্ঞায়িত করতে পারবেন না :(
জ্যাকব

131

এই অত্যন্ত সহায়ক বৈশিষ্ট্যটি এখন AngularJS এর ​​১.১.২ সংস্করণে পাওয়া যায়। এটি অস্থির হিসাবে বিবেচিত হয়েছে তবে আমি এটি ব্যবহার করেছি (1.1.3) এবং এটি দুর্দান্ত কাজ করে।

মূলত আপনি একটি টেম্পলেট ইউআরএল স্ট্রিং তৈরি করতে একটি ফাংশন ব্যবহার করতে পারেন। ফাংশনটি রুট পরামিতিগুলি পেরিয়ে গেছে যা আপনি টেম্পলেট ইউআরএল স্ট্রিংটি তৈরি এবং ফিরে পেতে ব্যবহার করতে পারেন।

var app = angular.module('app',[]);

app.config(
    function($routeProvider) {
        $routeProvider.
            when('/', {templateUrl:'/home'}).
            when('/users/:user_id', 
                {   
                    controller:UserView, 
                    templateUrl: function(params){ return '/users/view/' + params.user_id; }
                }
            ).
            otherwise({redirectTo:'/'});
    }
);

টান অনুরোধের জন্য https://github.com/lrlopez কে অনেক ধন্যবাদ ।

https://github.com/angular/angular.js/pull/1524


4
এটি এখন সম্পূর্ণরূপে 1.2 তে সমর্থিত এবং এটি সম্ভবত সবচেয়ে ভাল উপায়: ডকস.আঙ্গুলারজেএস.আর.পি.আই
স্টু

প্যারামগুলির উপর ভিত্তি করে একটি গতিশীল নিয়ন্ত্রণকারী সম্পর্কে কী?
ওক

দয়া করে, দয়া করে (দয়া করে) আমাকে বলুন যে এটি করা সম্ভব controllers? ...
কোডি

আপনি কীভাবে এই ক্ষেত্রে টেমপ্লেট থেকে নিয়ন্ত্রণকারীকে অ্যাক্সেস করতে পারেন ($ রুটপ্রভাইডার সরবরাহ করেছেন)? সাধারণত, যদি কন্ট্রোলারটি এনজি-কন্ট্রোলার = "মাইকন্ট্রোলার" নির্দেশের দ্বারা আবদ্ধ থাকে তবে আপনি এটি মাইক্রন্ট্রোলরকে মাইসিটিআরএল হিসাবে উল্লেখ করতে পারেন। এই ক্ষেত্রে আমি কীভাবে MyCtrl সংজ্ঞায়িত করব?
ফ্ল্যাভরস্কেপ

@ ফ্লাওয়ারস্কেপ আমার কেবল এই সমস্যাটি ছিল - সমাধানটি হ'ল $ রুটপ্রোভিডার.ওয়েন ("/ foo", {কন্ট্রোলার: "FooController", নিয়ন্ত্রক হিসাবে: "foo", টেম্পলেট ইউআরএল: "foo.html";);
এরিন

18

টেম্পলেট ইউআরএল উত্পন্ন URL টি দিয়ে ফাংশন হিসাবে ব্যবহার করা যেতে পারে। আমরা ইউআরএলকে পাসিং আর্গুমেন্টের সাথে ম্যানিপুলেট করতে পারি যা রুটপ্যারামগুলি লাগে।

উদাহরণ দেখুন।

.when('/:screenName/list',{
    templateUrl: function(params){
         return params.screenName +'/listUI'
    }
})

এই সাহায্য আশা করি।


7

ঠিক আছে, মনে হয় আমি পেয়েছি ...

ছোট্ট ব্যাকগ্রাউন্ডটি প্রথমে: যে কারণে আমার এটি প্রয়োজন তা হ'ল নোড এক্সপ্রেসের শীর্ষে কৌণিকটিকে আটকে রাখা এবং জেড আমার পার্টিশনগুলি প্রসেস করা উচিত।

সুতরাং এখানে যা করতে হবে ... (বিয়ার পান করুন এবং এর উপর 20+ ঘন্টা ব্যয় করুন !!!) ...

আপনি যখন নিজের মডিউল সেট আপ করবেন, $routeProviderবিশ্বব্যাপী সংরক্ষণ করুন :

// app.js:
var routeProvider
    , app = angular.module('Isomorph', ['ngResource']).config(function($routeProvider){

        routeProvider = $routeProvider;
        $routeProvider
            .when('/', {templateUrl: '/login', controller: 'AppCtrl'})
            .when('/home', {templateUrl: '/', controller: 'AppCtrl'})
            .when('/login', {templateUrl: '/login', controller: 'AppCtrl'})
            .when('/SAMPLE', {templateUrl: '/SAMPLE', controller: 'SAMPLECtrl'})
            .when('/map', {templateUrl: '/map', controller: 'MapCtrl'})
            .when('/chat', {templateUrl: '/chat', controller: 'ChatCtrl'})
            .when('/blog', {templateUrl: '/blog', controller: 'BlogCtrl'})
            .when('/files', {templateUrl: '/files', controller: 'FilesCtrl'})
            .when('/tasks', {templateUrl: '/tasks', controller: 'TasksCtrl'})
            .when('/tasks/new', {templateUrl: '/tasks/new', controller: 'NewTaskCtrl'})
            .when('/tasks/:id', {templateUrl: '/tasks', controller: 'ViewTaskCtrl'})
            .when('/tasks/:id/edit', {templateUrl: '/tasks', controller: 'EditTaskCtrl'})
            .when('/tasks/:id/delete', {templateUrl: '/tasks', controller: 'DeleteTaskCtrl'})
        .otherwise({redirectTo: '/login'});

});

// ctrls.js
...
app.controller('EditTaskCtrl', function($scope, $routeParams, $location, $http){

    var idParam = $routeParams.id;
    routeProvider.when('/tasks/:id/edit/', {templateUrl: '/tasks/' + idParam + '/edit'});
    $location.path('/tasks/' + idParam + '/edit/');

});
...

যা প্রয়োজন ছিল তার চেয়ে বেশি তথ্য হতে পারে ...

  • মূলত, আপনি $routeProviderবিশ্বব্যাপী আপনার মডিউলটির ভার সঞ্চয় করতে চান , যেমন routeProviderআপনার নিয়ন্ত্রণকারীদের দ্বারা এটি অ্যাক্সেস করা যায়।

  • তারপরে আপনি কেবল routeProviderএকটি নতুন রুটটি ব্যবহার এবং তৈরি করতে পারেন (আপনি 'একটি রুট পুনরায় সেট করতে পারবেন না' / 'পুনঃপ্রকাশ' করতে পারেন; আপনাকে অবশ্যই একটি নতুন তৈরি করতে হবে), আমি শেষে একটি স্ল্যাশ (/) যুক্ত করেছি যাতে এটি শব্দার্থক প্রথম হিসাবে

  • তারপরে (আপনার কন্ট্রোলারের অভ্যন্তরে), templateUrlআপনি যে ভিউটি চাপতে চান তাতে সেট করুন ।

  • অবজেক্টটির controllerসম্পত্তি বের করুন .when(), পাছে আপনি অসীম অনুরোধ লুপটি পাবেন না।

  • এবং অবশেষে (এখনও কন্ট্রোলারের ভিতরে), $location.path()সবে তৈরি হওয়া রুটে পুনঃনির্দেশ করতে ব্যবহার করুন ।

: আপনি কিভাবে একটি এক্সপ্রেস অ্যাপ্লিকেশন সম্মুখের একটি কৌণিক অ্যাপ্লিকেশন চড় আগ্রহী হন, তাহলে, আপনি আমার রেপো এখানে মাল করতে https://github.com/cScarlson/isomorph

এবং এই পদ্ধতিটি আপনাকে ওয়েবসকেটগুলি ব্যবহার করে আপনার ডাটাবেসে আপনার এইচটিএমএলকে আবদ্ধ করতে চান এমন ক্ষেত্রে অ্যাঙ্গুলার জেএস বাইরেশনাল ডেটা-বাইন্ডিংগুলি রাখার অনুমতি দেয়: অন্যথায় এই পদ্ধতিটি না থাকলে আপনার কৌণিক ডেটা-বাইন্ডিংগুলি কেবল আউটপুট হবে {{model.param}}

আপনি যদি এই মুহুর্তে এটি ক্লোন করেন তবে এটি চালানোর জন্য আপনার মেশিনে মঙ্গোডিবি লাগবে।

আশা করি এটি এই সমস্যার সমাধান করে!

কোডি

আপনার স্নানের জল পান করবেন না।


3

রাউটার: -

...
.when('/enquiry/:page', {
    template: '<div ng-include src="templateUrl" onload="onLoad()"></div>',
    controller: 'enquiryCtrl'
})
...

নিয়ামক: -

...
// template onload event
$scope.onLoad = function() {
    console.log('onLoad()');
    f_tcalInit();  // or other onload stuff
}

// initialize
$scope.templateUrl = 'ci_index.php/adminctrl/enquiry/'+$routeParams.page;
...

আমি বিশ্বাস করি যে এটি কৌণিকর ক্ষেত্রে একটি দুর্বলতা যে $ রুটপ্যারামগুলি রাউটারের ভিতরে দৃশ্যমান নয়। একটি ক্ষুদ্রতর বর্ধন বাস্তবায়নের সময় একটি পার্থক্য তৈরি করে।


3

আমি আমার কৌণিক কাঁটাচামচ এ জন্য সমর্থন যোগ করেছি। এটি আপনাকে নির্দিষ্ট করার অনুমতি দেয়

$routeProvider
    .when('/:some/:param/:filled/:url', {
          templateUrl:'/:some/:param/:filled/template.ng.html'
     });

https://github.com/jamie-pate/angular.js/commit/dc9be174af2f6e8d55b798209dfb9235f390b934

এটি কৌণিকর জন্য দানার বিরুদ্ধে এক ধরণের হিসাবে এটি গ্রহণ করা হবে তা নিশ্চিত নয়, তবে এটি আমার পক্ষে দরকারী


ঠিক! এখনও এটি ব্যবহার করা হয়নি তবে সত্যিই এটির প্রয়োজন। এমন কি অন্য কোন সতর্কতা রয়েছে যা আমাকে সন্ধান করা উচিত? এছাড়াও, এঙ্গুলার এটি প্রয়োগ করে কোন শব্দ? - আমি সিডিএন ব্যবহার করতে চাই
কোডি

কোনও ধারণা নেই, আমি কাগজের কাজটি স্বাক্ষর করতে পারি নি তাই এটি একটি শেষ অবধি, তবে আপনি পরিবর্তনটি নিতে পারেন এবং এটি নিজের মধ্যে টানতে চেষ্টা করতে পারেন (আমি যে সংস্থার সাথে ছিলাম সেখানে আর কাজ করি না এবং তারা করেনি আরও কৌণিক সংকেত অনুসরণ করুন)
জেমি পেট

ঠিক আছে, তথ্য এবং এই ইস্যুতে আপনার অবদানের জন্য ধন্যবাদ - আমি এটিকে টেনে আনব এবং এক মিনিটের মধ্যে এটির সাথে খেলব।
কোডি

1
//module dependent on ngRoute  
 var app=angular.module("myApp",['ngRoute']);
    //spa-Route Config file
    app.config(function($routeProvider,$locationProvider){
          $locationProvider.hashPrefix('');
          $routeProvider
            .when('/',{template:'HOME'})
            .when('/about/:paramOne/:paramTwo',{template:'ABOUT',controller:'aboutCtrl'})
            .otherwise({template:'Not Found'});
    }
   //aboutUs controller 
    app.controller('aboutCtrl',function($routeParams){
          $scope.paramOnePrint=$routeParams.paramOne;
          $scope.paramTwoPrint=$routeParams.paramTwo;
    });

ইনডেক্স। html এ

<a ng-href="#/about/firstParam/secondParam">About</a>

ফার্স্টপরাম এবং সেকেন্ডপ্রাম আপনার প্রয়োজন অনুসারে যে কোনও কিছু হতে পারে।


0

আমার অনুরূপ সমস্যা ছিল এবং এর $stateParamsপরিবর্তে আমি ব্যবহার করেছিrouteParam

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