কৌণিক জেএস গতিশীল রাউটিং


88

রাউটিংটি অন্তর্নিহিত সহ আমার বর্তমানে একটি কৌণিক জেএস অ্যাপ্লিকেশন রয়েছে It এটি কাজ করে এবং সবকিছু ঠিক আছে।

আমার app.js ফাইলটি দেখতে এমন দেখাচ্ছে:

angular.module('myapp', ['myapp.filters', 'myapp.services', 'myapp.directives']).
  config(['$routeProvider', function ($routeProvider) {
      $routeProvider.when('/', { templateUrl: '/pages/home.html', controller: HomeController });
      $routeProvider.when('/about', { templateUrl: '/pages/about.html', controller: AboutController });
      $routeProvider.when('/privacy', { templateUrl: '/pages/privacy.html', controller: AboutController });
      $routeProvider.when('/terms', { templateUrl: '/pages/terms.html', controller: AboutController });
      $routeProvider.otherwise({ redirectTo: '/' });
  }]);

আমার অ্যাপ্লিকেশনটিতে একটি সিএমএস রয়েছে যেখানে আপনি / পৃষ্ঠাগুলির ডিরেক্টরিতে নতুন এইচটিএমএল ফাইল অনুলিপি করতে এবং যুক্ত করতে পারবেন ।

আমি এখনও নতুন গতিযুক্ত যুক্ত ফাইলগুলির জন্য রাউটিং সরবরাহকারীর মাধ্যমে যেতে চাই।

একটি আদর্শ বিশ্বে রাউটিং প্যাটার্নটি হ'ল:

$ রুটপ্রভাইডার.ওহেন ('/ পৃষ্ঠার নাম ', {টেমপ্লেট ইউআরএল : '/ পৃষ্ঠাগুলি / পৃষ্ঠার নাম। html ', নিয়ামক: সিএমএসকন্ট্রোলার});

সুতরাং যদি আমার নতুন পৃষ্ঠার নামটি "কন্টাক্ট.এইচটিএমএল" হত তবে আমি কৌনিকটি "/ পরিচিতি" বাছাই করতে চাই এবং "/pages/contact.html" এ পুনঃনির্দেশ করব।

এটা কি সম্ভব ?! এবং যদি তাই হয় কিভাবে ?!

হালনাগাদ

আমার এখন এটি আমার রাউটিং কনফিগারেশনে রয়েছে:

$routeProvider.when('/page/:name', { templateUrl: '/pages/home.html', controller: CMSController })

এবং আমার সিএমএস নিয়ন্ত্রণকারীতে:

function CMSController($scope, $route, $routeParams) {
    $route.current.templateUrl = '/pages/' + $routeParams.name + ".html";
    alert($route.current.templateUrl);
}
CMSController.$inject = ['$scope', '$route', '$routeParams'];

এটি বর্তমান টেম্পলেটটি ইউরালকে সঠিক মান হিসাবে সেট করে।

তবে আমি এখন নতুন টেমপ্লেট ইউআরএল মান দিয়ে এনজি-ভিউ পরিবর্তন করতে চাই । এটি কীভাবে সম্পন্ন হয়?

উত্তর:


133
angular.module('myapp', ['myapp.filters', 'myapp.services', 'myapp.directives']).
        config(['$routeProvider', function($routeProvider) {
        $routeProvider.when('/page/:name*', {
            templateUrl: function(urlattr){
                return '/pages/' + urlattr.name + '.html';
            },
            controller: 'CMSController'
        });
    }
]);
  • * যুক্ত করা আপনাকে কাজ করতে দেয় একাধিক স্তরের ডিরেক্টরিগুলির সাথে গতিশীলভাবে কাজ করতে দেয়। উদাহরণ: / পৃষ্ঠা / গাড়ি / বিক্রয় / তালিকা এই সরবরাহকারীর উপর ধরা পড়বে

দস্তাবেজগুলি থেকে (1.3.0):

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

{অ্যারের

এছাড়াও

কখন (পথ, পথ): পদ্ধতি

  • পাথটিতে নামযুক্ত গোষ্ঠীগুলি একটি কোলন দিয়ে শুরু হয়ে তারার সাথে শেষ হতে পারে: উদাহরণস্বরূপ: নাম *। সমস্ত অক্ষর আগ্রহের সাথে name রুটপ্যারামগুলিতে প্রদত্ত নামের অধীনে সংরক্ষণ করা হয় যখন রুটটি মেলে।

4
সময়ের সাথে সরানো দরকার ... আমি যে কার্যকারিতাটি তৈরি করেছি v1.0.2 এ অনুপস্থিত ছিল তা এখন উপলব্ধ। এইটির গৃহীত উত্তরটি আপডেট করা হচ্ছে
গ্রেগ

সত্যি কথা বলতে কি আমি এই কাজটি বর্তমান 1.3 বিটার সাথে পাইনি
আর্কিমিডিস ট্রাজানো

আসলে এটি কাজ করেছিলাম যখন আমি এটি করেছি ... যখন ('/: পৃষ্ঠা', {টেম্পলেট ইউআরএল: ফাংশন (পরামিতি) {প্যারামিটারগুলি.পরে + + .html ';}
আর্কিমিডিস ট্রাজানো

গম্ভীরভাবে .. এটি সত্যই বোকামি যে কৌনিকটি এটির একটি পূর্বনির্ধারিত আচরণ হিসাবে না ... সেই ম্যানুয়াল রুটিংটি হাস্যকর
গিলহার্ম ফেরেইরা

4
দয়া করে ব্যাখ্যা করুন, কোথা থেকে urlattrসেট করা বা প্রেরণ করা হয়েছে, মানে কী urlattr.nameউত্পাদন করবে?
সামি

37

ঠিক আছে সমাধান।

গিটহাবটিতে সমাধান যুক্ত করা হয়েছে - http://gregorypratt.github.com/AngularDynamicRouting

আমার app.js রাউটিং কনফিগারেশনে:

$routeProvider.when('/pages/:name', {
    templateUrl: '/pages/home.html', 
    controller: CMSController 
});

তারপরে আমার সিএমএস নিয়ামকটিতে:

function CMSController($scope, $route, $routeParams) {

    $route.current.templateUrl = '/pages/' + $routeParams.name + ".html";

    $.get($route.current.templateUrl, function (data) {
        $scope.$apply(function () {
            $('#views').html($compile(data)($scope));
        });
    });
    ...
}
CMSController.$inject = ['$scope', '$route', '$routeParams'];

# দর্শন আমার সাথে <div id="views" ng-view></div>

সুতরাং এখন এটি স্ট্যান্ডার্ড রাউটিং এবং গতিশীল রাউটিংয়ের সাথে কাজ করে।

এটি পরীক্ষা করার জন্য আমি কপিরাইট করা সম্পর্কে সম্পর্কে। Html এটিকে পোর্টফোলিও। Html বলেছি, এর কিছু বিষয়বস্তু পরিবর্তন /#/pages/portfolioকরেছি এবং আমার ব্রাউজারে প্রবেশ করেছি এবং আরে প্রিস্টো পোর্টফোলিও html প্রদর্শিত হয়েছিল ....

আপডেট করা হয়েছে t প্রয়োগ এবং $ এইচটিএমএলকে সংকলন করুন যাতে ডায়নামিক সামগ্রী অন্তর্ভুক্ত করা যায় ected


4
এটি কেবল স্থির সামগ্রী সহ কাজ করে, যদি আমি এটি সঠিকভাবে বুঝতে পারি। এটি কারণ আপনি ডকুমকে পরিবর্তিত করছেন আপনি jQuery মাধ্যমে (কৌণিক এর স্কোপ বাইরে) নিয়ন্ত্রক ইনস্ট্যান্ট করার পরে। {{এই} like এর মতো চলকগুলি কাজ করতে পারে (আমাকে এটি চেষ্টা করে দেখতে হবে) তবে সম্ভবত নির্দেশিকা তা করবে না। এ থেকে সাবধান থাকুন, এখন এটি কার্যকর হতে পারে তবে কোডটি পরে ভাঙতে পারে ..
টিয়াগো রোলডো

সত্য, বাঁধাই কাজ করে না, তবে আমার পক্ষে আমি খুব বেশি জড়িত নই কারণ আমি কেবল ক্লায়েন্টদেরই নতুন পৃষ্ঠা যুক্ত করতে সক্ষম হতে চাই। আমি যুক্ত করা যে কোনও পৃষ্ঠা আমি রুট কনফিগারেশনের মাধ্যমে যথাযথভাবে নির্দিষ্ট করব। যদিও ভাল পয়েন্ট।
গ্রেগ

4
আপনি যদি স্থির এইচটিএমএল সামগ্রী সরবরাহ করতে চান তবে এটি কোনও খারাপ সমাধান নয়। আপনি যতক্ষণ মনে রাখবেন ততক্ষণ আপনি স্থিতিশীল (অ কৌণিক) সামগ্রী সহ এনজি-ভিউটি মূলত ওভাররাইড করছেন। এই বিষয়টি মনে রেখে, এই দুটি বিভাগকে আলাদা করা, <ডি আইডি = "ব্যবহারকারী-মতামত"> </ ডিভি> উপাদান হিসাবে কিছু তৈরি করা এবং সেখানে আপনার "ব্যবহারকারী টেম্পলেট" ইনজেকশন করা পরিষ্কার হবে clean এছাড়াও, .c রুট কন্টেন্ট.টিম্পলেট ইউআরএল - ওভাররাইড করার ক্ষেত্রে কোনও ধারণা নেই - একটি $ સ્કોপ.ইউসারটেম্পলেট মডেল তৈরি করা এবং $ ('# ব্যবহারকারী-দৃষ্টিভঙ্গি ") করা। লোড ($ স্কোপ.ইউজারটেম্পলেট) ক্লিনার, এবং কৌনিকগুলির কোনওটিই ভেঙে দেয় না কোড।
টিয়াগো রোলডো

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

4
কাজ করে, তবে আপনার নিয়ামকটিতে আপনার DOM ম্যানিপুলেশন করা উচিত নয়।
ডাম্যাকারম্যান

16

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

'use strict';

angular.module('myapp', []).config(function($provide, $routeProvider) {
    $provide.factory('$routeProvider', function () {
        return $routeProvider;
    });
}).run(function($routeProvider, $http) {
    $routeProvider.when('/', {
        templateUrl: 'views/main.html',
        controller: 'MainCtrl'
    }).otherwise({
        redirectTo: '/'
    });

    $http.get('/dynamic-routes.json').success(function(data) {
        $routeProvider.when('/', {
            templateUrl: 'views/main.html',
            controller: 'MainCtrl'
        });
        // you might need to call $route.reload() if the route changed
        $route.reload();
    });
});

(পরে উপলভ্য ) $routeProviderহিসাবে ব্যবহারের জন্য Aliasing সুরক্ষা এবং অ্যাপ্লিকেশন সংহতি - ভাল উপায়, দুর্দান্ত কৌশল (upvote!) দিয়ে ভাল খেলবে না। factoryconfig
কোডি

@ কোডি আপনি কি সুরক্ষা / অ্যাপ সংহতি নোটটি ব্যাখ্যা করতে পারবেন? আমরা একই ধরণের নৌকায় আছি এবং উপরের উত্তরের মতো কিছু সত্যিই সুবিধাজনক হবে।
ভার্চুয়াল্যান্ডি

4
@ ভার্চুয়াল্যান্ডি, আপনি সাধারণত বিভিন্ন পর্যায়ে সরবরাহকারী তৈরি করার কারণে এটি সাধারণত একটি দুর্দান্ত পদ্ধতি নয় - যা কনফিগারেশনের পর্যায়ে গোপন করা উচিত এমন উচ্চ-স্তরের ব্যবহারগুলি ফাঁস করতে পারে। আমার পরামর্শ হ'ল ইউআই-রাউটার নিয়োগ (প্রচুর অসুবিধার যত্ন নেয়), "সমাধান", "কন্ট্রোলারএএস", এবং কোনও ফাংশনে টেম্পলেট ইউআরএল সেট করার মতো অন্যান্য অনুষদ ব্যবহার করুন। আমি একটি "প্রসলেভ" মডিউলও তৈরি করেছি যা আমি ভাগ করতে পারি a কোনও রুট স্কিমের কোনও অংশ (টেমপ্লেট, টেম্পলেট ইউআরএল, নিয়ামক, ইত্যাদি) ইন্টারপোলেট করতে পারে। উপরের সমাধানটি আরও মার্জিত একটি - তবে আপনার প্রধান উদ্বেগগুলি কী?
কোডি

4
@ ভার্চুয়াল্যান্ডি, অলস লোডেড টেম্পলেট, নিয়ন্ত্রণকারী ইত্যাদির জন্য এখানে একটি মডিউল রয়েছে - এটি কোনও রেপোতে নয়, তবে ক্ষমা চেয়েছেন : jsfiddle.net/cCarlson/zdm6gpnb ... এই অলসটি উপরেরটি - এবং - কোনও কিছুকে বিভক্ত করতে পারে ইউআরএল পরামিতি উপর ভিত্তি করে। মডিউলটি কিছু কাজ ব্যবহার করতে পারে তবে এটি কমপক্ষে একটি প্রাথমিক পয়েন্ট।
কোডি

@ কোডি - কোনও সমস্যা নেই, নমুনা এবং আরও ব্যাখ্যার জন্য ধন্যবাদ। বোধগম্যতা। আমাদের ক্ষেত্রে, আমরা কৌণিক-রুট-বিভাগটি ব্যবহার করছি এবং এটি দুর্দান্তভাবে কাজ করেছে। তবে আমাদের এখন "গতিশীল" রুটগুলি সমর্থন করতে হবে (কিছু কিছু পৃষ্ঠার পুরো বৈশিষ্ট্য / রুটগুলি থাকতে পারে না, বা তাদের নাম পরিবর্তন করতে পারে)) এবং কিছু জেএসএনে লোড করার ধারণা যা বাস্তবায়নের আগে রুটগুলি সংজ্ঞায়িত করে তা আমাদের চিন্তাভাবনা ছিল তবে স্পষ্টতই .config () এর মধ্যে $ HTTP / $ সরবরাহকারী ব্যবহার করে সমস্যায় পড়ে।
ভার্চুয়াল্যান্ডি

7

$ রুটপ্রভাইডার ইউআরআই প্যাটারগুলিতে আপনি ভেরিয়েবল প্যারামিটারগুলি নির্দিষ্ট করতে পারেন: যেমন: $routeProvider.when('/page/:pageNumber' ...এবং এটি আপনার নিয়ামকটিতে $ রুটপ্যারামের মাধ্যমে অ্যাক্সেস করতে পারেন।

$ রুট পৃষ্ঠার শেষে একটি ভাল উদাহরণ রয়েছে: http://docs.angularjs.org/api/ng.$route

সম্পাদনা (সম্পাদিত প্রশ্নের জন্য):

দুর্ভাগ্যক্রমে রাউটিং সিস্টেমটি অত্যন্ত সীমাবদ্ধ - এই বিষয়টি নিয়ে প্রচুর আলোচনা রয়েছে, এবং কয়েকটি সমাধান প্রস্তাব করা হয়েছে, একাধিক নামকরণ মতামত ইত্যাদি তৈরির মাধ্যমে etc তবে এখনই, এনজিভিউ নির্দেশিকা প্রতি রুটে কেবলমাত্র একটি দর্শন দেয় ves এক থেকে এক ভিত্তিতে। আপনি একাধিক উপায়ে এটি সম্পর্কে যেতে পারেন - সবচেয়ে সহজ হ'ল ভিউর টেমপ্লেটটি লোডার হিসাবে ব্যবহার করে, এ<ng-include src="myTemplateUrl"></ng-include> ভিউর মধ্যে ট্যাগ হবে ($ স্কোপ.মিটাইপলেট ইউআরএল নিয়ামকটিতে তৈরি করা হবে)।

আমি আরও জটিল (তবে ক্লিনার, বৃহত্তর এবং আরও জটিল সমস্যার জন্য) সমাধানটি ব্যবহার করি, মূলত the রুট পরিষেবাটি পুরোপুরি এড়িয়ে যাওয়া, যা এখানে বিস্তারিত:

http://www.bennadel.com/blog/2420- ম্যাপিং -আঙ্গুলার জেএস- রুটস- ওন্টো-ইউআরএল- প্যারামিটারস- এবং ক্লায়েন্ট- সাইড- এভেন্টস htm


আমি ng-includeপদ্ধতিটি পছন্দ করি। এটি সত্যিই সহজ এবং এটি ডিওএমকে চালিত করার চেয়ে আরও ভাল পদ্ধতির।
নীল

5

নিশ্চিত না কেন এটি কাজ করে তবে গতিশীল (বা ওয়াইল্ডকার্ড যদি আপনি পছন্দ করেন) রুটগুলি কৌণিক 1.2.0-rc.2 এ সম্ভব হয় ...

http://code.angularjs.org/1.2.0-rc.2/angular.min.js
http://code.angularjs.org/1.2.0-rc.2/angular-route.min.js

angular.module('yadda', [
  'ngRoute'
]).

config(function ($routeProvider, $locationProvider) {
  $routeProvider.
    when('/:a', {
  template: '<div ng-include="templateUrl">Loading...</div>',
  controller: 'DynamicController'
}).


controller('DynamicController', function ($scope, $routeParams) {
console.log($routeParams);
$scope.templateUrl = 'partials/' + $routeParams.a;
}).

উদাহরণ.com/foo -> "foo" আংশিক লোড করে

উদাহরণ.com / বার-> "বার" আংশিক লোড করে

এনজি-ভিউতে কোনও সামঞ্জস্যের প্রয়োজন নেই। '/: A' কেসটি কেবলমাত্র ভেরিয়েবলের মধ্যে আমি খুঁজে পেয়েছি যা এটিকে ঘটাবে .. '/: foo' কাজ করে না যতক্ষণ না আপনার পার্টিশালগুলি সমস্ত foo1, foo2, ইত্যাদি হয় ... '/: a' কোনও আংশিক সাথে কাজ করে না নাম

সমস্ত মান গতিশীল নিয়ামককে আগুন দিয়ে দেয় - সুতরাং কোনও "অন্যথায়" নেই তবে, আমি মনে করি আপনি গতিশীল বা ওয়াইল্ডকার্ড রাউটিং দৃশ্যে যা খুঁজছেন তা হ'ল ..


2

AngularJS 1.1.3 হিসাবে, আপনি এখন নতুন ক্যাচ-অল প্যারামিটারটি ব্যবহার করে যা করতে চান ঠিক তেমন করতে পারেন।

https://github.com/angular/angular.js/commit/7eafbb98c64c0dc079d7d3ec589f1270b7f6fea5

প্রতিশ্রুতি থেকে:

এটি রুটপ্রভাইডারকে প্যারামিটারগুলি মেনে নিতে অনুমতি দেয় যা সাবস্ট্রিংয়ের সাথে মেলে এমনকি যদি তাদের কোনও কোলনের পরিবর্তে একটি নক্ষত্রের সাথে উপসর্গ করা থাকে তবে স্ল্যাশ থাকে। উদাহরণস্বরূপ, এর মতো রুটের edit/color/:color/largecode/*largecode সাথে এই জাতীয় কিছু মিলবে http://appdomain.com/edit/color/brown/largecode/code/with/slashs

আমি নিজে এটি পরীক্ষা করেছি (1.1.5 ব্যবহার করে) এবং এটি দুর্দান্ত কাজ করে। কেবল মনে রাখবেন যে প্রতিটি নতুন ইউআরএল আপনার নিয়ামকটিকে পুনরায় লোড করবে, সুতরাং যে কোনও ধরণের অবস্থা রাখতে, আপনাকে একটি কাস্টম পরিষেবা ব্যবহার করতে হতে পারে।


0

এখানে আরও একটি সমাধান যা ভাল কাজ করে।

(function() {
    'use strict';

    angular.module('cms').config(route);
    route.$inject = ['$routeProvider'];

    function route($routeProvider) {

        $routeProvider
            .when('/:section', {
                templateUrl: buildPath
            })
            .when('/:section/:page', {
                templateUrl: buildPath
            })
            .when('/:section/:page/:task', {
                templateUrl: buildPath
            });



    }

    function buildPath(path) {

        var layout = 'layout';

        angular.forEach(path, function(value) {

            value = value.charAt(0).toUpperCase() + value.substring(1);
            layout += value;

        });

        layout += '.tpl';

        return 'client/app/layouts/' + layout;

    }

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