আপনি AngularUI বুটস্ট্র্যাপে নির্দিষ্ট টেম্পলেটগুলি ওভাররাইড করতে পারেন?


88

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


4
আমি নিজেও $modalসার্ভিসটি সজ্জিত করে আরও রক্ষণাবেক্ষণের মাথাব্যথা তৈরি না করে (আশাকরি) আরও কনফিগারেশনে পাওয়ার জন্য খুঁজে পেয়েছি । $provide.decorator('$modal'... আমার ক্ষেত্রে আমি modalWindowউপাদানটি রেন্ডার করতে চাইনি । কখনও। আমি কেবল এটি ব্যবহার করছিলাম না, এবং এটিই আমি সেরাভাবে সামনে আসতে পেরেছিলাম। আমি কারও কাছে থাকলে আরও ভাল উপায় শুনতে পছন্দ করি।
বডাইন

উত্তর:


123

হ্যাঁ, http://angular-ui.github.io/bootstrap এর দিকনির্দেশগুলি অত্যন্ত স্বনির্ধারিত এবং কোনও একটি টেমপ্লেটকে ওভাররাইড করা সহজ (এবং এখনও অন্য নির্দেশাবলীর জন্য ডিফল্টগুলির উপর নির্ভর করে)।

এটি $templateCacheখাওয়ানোর জন্য যথেষ্ট , হয় একে সরাসরি খাওয়ানো ( ui-bootstrap-tplsফাইলে যেমন করা হয়েছে ) বা - সম্ভবত সহজ - <script>নির্দেশনা ( ডক ) ব্যবহার করে কোনও টেম্পলেট ওভাররাইড করে ।

একটি কল্পিত উদাহরণ যেখানে আমি swap 'র সতর্ক টেম্পলেট পরিবর্তন করছি xজন্য Closeনিম্নে দেখানো হল:

<!doctype html>
<html ng-app="plunker">
  <head>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.5/angular.js"></script>
    <script src="http://angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.4.0.js"></script>
    <script src="example.js"></script>
    <link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css" rel="stylesheet">

    <script id="template/alert/alert.html" type="text/ng-template">
      <div class='alert' ng-class='type && "alert-" + type'>
          <button ng-show='closeable' type='button' class='close' ng-click='close()'>Close</button>
          <div ng-transclude></div>
      </div>
    </script>
  </head>

  <body>
    <div ng-controller="AlertDemoCtrl">
      <alert ng-repeat="alert in alerts" type="alert.type" close="closeAlert($index)">                     
        {{alert.msg}}
      </alert>
      <button class='btn' ng-click="addAlert()">Add Alert</button>
    </div>
  </body>
</html>

লাইভ প্লঙ্কার: http://plnkr.co/edit/gyjVMBxa3fToYTFJtnij?p= পূর্বরূপ


19
আমি এই উত্তর পছন্দ। আমি ঠিক এটিকে পছন্দ করি না যে এটি অ্যাংুলার ইউআই এর ডকুমেন্টেশন পৃষ্ঠাগুলিতে অন্তর্ভুক্ত নেই এবং মডেল দেখানোর মতো সহজ কিছু কীভাবে করা যায় তা নির্ধারণের জন্য আমাকে বেশ সময় নিয়েছিল।
ত্রি ভুং

4
@ ব্রুসব্যানার ডকুমেন্টেশন এবং শক্ত কার্যকারণের উদাহরণগুলি অ্যাংুলার ইউআইয়ের দুটি বৃহত্তম পতন। প্রকল্পটি দুর্দান্ত তবে এর জন্য কিছু মিষ্টি টেন্ডার বিকাশকারী প্রেম দরকার।
রবিন ভ্যান বালেন

4
@ রবিনভানবালেন এটি একটি কৌণিক-জেএস বৈশিষ্ট্য (কৌণিক-ইউআই নয়), এটি ইতিমধ্যে কৌণিক জেএসের সরকারী দস্তাবেজগুলিতে নথিভুক্ত হয়েছে
ভিকি ২

নির্দেশের টেমপ্লেটগুলিকে ওভাররাইড করার জন্য এটি কৌণিক উপায় (এই ক্ষেত্রে ভাল উপায়) হিসাবে দয়া করে @ জিসিটি উত্তরটি $ সরবরাহ.ডেকোরেটর সম্পর্কে পরীক্ষা করুন। এবং এটি মোটামুটি সহজ। কেবলমাত্র কোনও টেমপ্লেটকে $ টেমপ্লেট ক্যাশে যুক্ত করা / ওভাররাইড করা সত্যিই সেরা অনুশীলন নয়।
জন বার্নার্ডসন

@ জন আপনি যে জিনিসগুলি পাবেন সেখান থেকে আমি নিশ্চিত নই "এটিই কৌণিক উপায়ে (এই ক্ষেত্রে ভাল উপায়)" এবং "কেবলমাত্র $ টেমপ্লেটকে একটি টেম্পলেট যুক্ত / ওভাররাইড করা ভাল অভ্যাস নয়" তবে কৌণিক- একটি হিসাবে ui এবং কৌনিক রক্ষণাবেক্ষণকারীরা আপনাকে নিশ্চয়তা দিতে পারি যে ওভাররাইডিং টেম্পলেটগুলির সাথে কোনও ভুল নেই। ভাগ না করার জন্য নির্দিষ্ট সমস্যাগুলি না
পেলে

80

ব্যবহার $provide.decorator

ব্যবহার $provideডিরেক্টিভের সাজাইয়া সাথে সরাসরি জগাখিচুড়ি প্রায় প্রয়োজনীয়তা এড়াতে $templateCache

পরিবর্তে, আপনার বাহ্যিক টেমপ্লেট এইচটিএমএল তৈরি করুন যা আপনি সাধারণত যা খুশি নাম সহ সাধারণভাবে করতে পারেন, এবং তারপরে নির্দেশকে নির্দেশ templateUrlকরতে এটি ওভাররাইড করুন ।

angular.module('plunker', ['ui.bootstrap'])
  .config(['$provide', Decorate]);

  function Decorate($provide) {
    $provide.decorator('alertDirective', function($delegate) {
      var directive = $delegate[0];

      directive.templateUrl = "alertOverride.tpl.html";

      return $delegate;
    });
  }

পোকোজ্লোস্কি.ওপেনসোর্সের প্লাঙ্কার কাঁটাচামচ : http://plnkr.co/edit/RE9AvUwEmKmAzem9mfpI?p= পূর্বরূপ

(নোট করুন যে আপনি যে দিকনির্দেশক নামটি সাজাতে চান তার সাথে অবশ্যই আপনাকে অবশ্যই 'নির্দেশিকা' প্রত্যয় যুক্ত করতে হবে ove উপরে, আমরা ইউআই বুটস্ট্র্যাপের alertনির্দেশ সজ্জিত করছি , তাই আমরা নামটি ব্যবহার করি alertDirective))

যেহেতু আপনি প্রায়শই কেবল ওভাররাইডের চেয়ে আরও বেশি কিছু করতে চান templateUrl, এটি একটি ভাল সূচনা পয়েন্ট দেয় যা থেকে নির্দেশকে আরও প্রসারিত করা যায়, উদাহরণস্বরূপ লিঙ্কটি ওভাররাইড / মোড়ানো বা ফাংশন ( উদাহরণস্বরূপ ) দ্বারা সংযোজন করে ।


9
এটি সঠিক সমাধান এবং কৌনিক সেরা অনুশীলনগুলি অনুসরণ করে। এইচটিএমএল তৈরি করতে আপনার স্ট্রিংগুলি কখনও ব্যবহার করা উচিত নয়, বা আপনাকে তৃতীয় পক্ষের স্ক্রিপ্টগুলি ইনজেক্ট করার ক্ষেত্রে সূচিপত্র HTML ফাইলটিতে স্পষ্টভাবে অন্তর্ভুক্ত করা উচিত নয়। ধন্যবাদ @ জিসিটি!
টমিম্যাক

4
হাই, alertDirectiveএকটি কীওয়ার্ড? যদি হ্যাঁ, কীওয়ার্ডটি কী Tabs? আমি ট্যাবগুলিতে অনুরূপ কাজ করার চেষ্টা করছি, তবে আমি সতর্কতা.জেএস দেখেছি এবং সেখানে তারা কোথায় আছে তা আমি দেখতে পাচ্ছি alertDirectiveনা।
কোডেনমেজারো

4
$compileProviderযখন আপনি এটি নিবন্ধভুক্ত করেন তখন কৌণিকগুলি আপনার নির্দেশিকার নামে একটি 'নির্দেশিকা' প্রত্যয় যুক্ত করে ( $filterProviderএকইভাবে 'ফিল্টার' প্রত্যয় দিয়েও করা হয়); বেশিরভাগ উদ্দেশ্যে এটি অদৃশ্য, তবে সাজসজ্জা করার সময় আপনি যে লক্ষ্যটিকে লক্ষ্য করতে চান সেই নির্দেশকে এই প্রত্যয় যুক্ত করতে হবে। উদাহরণস্বরূপ, tabDirectiveবা tabsetDirective, ইত্যাদি ঠিক যে কোথাও আমি পেয়েছি ঠিক তেমন নথিভুক্ত নয়, তবে $filterProviderকমপক্ষে এখানে একইরকম আচরণের জন্য একটি রেফারেন্স দেওয়া হয়েছে : ডকস.আঙ্গুলারজ.স.সি
পি

4
অনেক ধন্যবাদ @ জেসিটি, একটি দুর্দান্ত উত্তর। এটি যাওয়ার সঠিক উপায়। এবং, যেমন আপনি বলেছেন, তৃতীয় পক্ষের নির্দেশের "সাজসজ্জা" করার একটি ভাল সূচনা পয়েন্ট :)
জন বার্নার্ডসন

4
@ ভ্যালেরাটুমাস: দেরিতে উত্তরের জন্য দুঃখিত হ্যাঁ, আমি মনে করি আপনার কনফিগারটি আঁটসাঁট হয়ে যাবে; তবে, কৌণিক v1.3 থেকে আমি বিশ্বাস করি আপনি একটি function(element, attributes)টেম্পলেট ইউআরএল সরবরাহ করতে পারেন । আপনি এটি কিছু গতিশীল আচরণের জন্য ব্যবহার করতে পারেন (মূল টেম্পলেট ইউআরএল ফাংশনটি বা কোনও বৈশিষ্ট্যের উপর নির্ভর করে আপনার নিজের url স্ট্রিং ইত্যাদি)। যাইহোক, ui.bootstrap এখন আপনাকে template-urlনির্দেশের উপর কোনও অ্যাট্রিবিউট সরবরাহ করতে এই একই কার্যকারিতাটিও ব্যবহার করে , যাতে আপনি সম্ভবত এটি ব্যবহার করতে পারেন যদি আপনি সরাসরি উপাদান নির্দেশকের মাধ্যমে টেমপ্লেট পাথ সরবরাহ করতে খুশি হন।
জেসিটি

27

Pkozlowski.opensource থেকে উত্তরটি সত্যিই দরকারী এবং আমাকে অনেক সাহায্য করেছে! আমি আমার কৌনিক টেম্পলেটটিকে ওভাররাইডগুলি সংজ্ঞায়িত করার জন্য একটি একক ফাইল রাখার শর্তে এটি ট্যুইক করেছি এবং পেওলডের আকারটি কম রাখতে বহিরাগত জেএস লোড করেছি।

এটি করতে, কৌনিক ইউআই-বুটস্ট্র্যাপ উত্স জেএস ফাইলের নীচে যান (যেমন ui-bootstrap-tpls-0.6.0.js) এবং আপনার আগ্রহী টেম্পলেটটি সন্ধান করুন the টেমপ্লেটটি সংজ্ঞায়িত করে এমন পুরো ব্লকটি অনুলিপি করুন এবং এটি আপনার ওভাররাইড জেএস ফাইলটিতে আটকান paste

যেমন

angular.module("template/alert/alert.html", []).run(["$templateCache", function($templateCache) {
  $templateCache.put("template/alert/alert.html",
     "      <div class='alert' ng-class='type && \"alert-\" + type'>\n" +
     "          <button ng-show='closeable' type='button' class='close' ng-click='close()'>Close</button>\n" +
     "          <div ng-transclude></div>\n" +
     "      </div>");
}]);

তারপরে ইউআই-বুটস্ট্র্যাপের পরে আপনার ওভাররাইড ফাইলটি অন্তর্ভুক্ত করুন এবং আপনি একই ফলাফল অর্জন করতে পারেন।

এর Forked সংস্করণ pkozlowski.opensource এর ডল্যার http://plnkr.co/edit/iF5xw2YTrQ0IAalAYiAg?p=preview


4
আমি এই একই প্যাটার্নটি ব্যবহার করি এবং এটি কার্যকর হলেও; আমি সত্যিই আরও ভাল উপায় আছে ইচ্ছুক। আমি মনে করি ক্লোবার্বিংয়ের চেয়ে আমি কনফিগারেশন পছন্দ করব।
বডাইন

7

আপনি template-url="/app/.../_something.template.html"সেই নির্দেশের জন্য বর্তমান টেম্পলেটটিকে ওভাররাইড করতে ব্যবহার করতে পারেন ।

(কমপক্ষে অ্যাকর্ডিয়ান বুটস্ট্র্যাপে কাজ করে))

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