AngularJS + JQuery: অ্যাঙ্গুলারজে কীভাবে ডায়নামিক সামগ্রী কাজ করা যায়


84

আমি jQuery এবং AngularJS উভয় ব্যবহার করে একটি অ্যাজাক্স অ্যাপে কাজ করছি।

আমি যখন jQuery এর htmlফাংশন ব্যবহার করে একটি ডিভের বিষয়বস্তু (যার মধ্যে AngularJS বাইন্ডিং রয়েছে) আপডেট করি , তখন AngularJS বাইন্ডিংগুলি কাজ করে না।

নীচে আমি যা করার চেষ্টা করছি তার কোডটি নিম্নরূপ:

$(document).ready(function() {
  $("#refreshButton").click(function() {
    $("#dynamicContent").html("<button ng-click='count = count + 1' ng-init='count=0'>Increment</button><span>count: {{count}} </span>")
  });
});
</style><script src="http://docs.angularjs.org/angular-1.0.1.min.js"></script><style>.ng-invalid {
  border: 1px solid red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="">
  <div id='dynamicContent'>
    <button ng-click="count = count + 1" ng-init="count=0">
        Increment
      </button>
    <span>count: {{count}} </span>
  </div>


  <button id='refreshButton'>
    Refresh
  </button>
</div>

আমার আইডি সহ একটি ডিভের ভিতরে ডায়নামিক সামগ্রী রয়েছে #dynamicContentএবং আমার একটি রিফ্রেশ বোতাম রয়েছে যা রিফ্রেশ ক্লিক করা হলে এই ডিভের বিষয়বস্তু আপডেট করে। বর্ধন প্রত্যাশার মতো কাজ করে যদি আমি বিষয়বস্তুকে রিফ্রেশ না করি তবে আমি রিফ্রেশ করার পরে, AngularJS বাঁধাই কাজ করা বন্ধ করে দেয়।

এটি অ্যাঙ্গুলারজেএসে বৈধ নাও হতে পারে তবে আমি প্রাথমিকভাবে jQuery দিয়ে অ্যাপ্লিকেশন তৈরি করেছি এবং পরে AngularJS ব্যবহার শুরু করেছি যাতে আমি AngularJS- তে সমস্ত স্থানান্তর করতে পারি না। অ্যাঙ্গুলারজেএস এ কাজ করার সাথে যে কোনও সহায়তা প্রশংসিত হয়।


4
এই কার্যকারিতার জন্য জিকুয়ারি ব্যবহার করার কোনও বিশেষ কারণ আছে কি? যেহেতু এটি দুর্দান্ত এবং সহজেই কৌণিক দ্বারা আচ্ছাদিত: < jsfiddle.net/pkozlowski_opensource/YCrFD/2 >
pkozlowski.opensource

4
সমস্যাটি দেখানোর জন্য এটি আমার আসল ব্যবহারের কেসটির একটি সরলিকৃত সংস্করণ। প্রকৃত অ্যাপ্লিকেশনটিতে গতিশীল বিষয়বস্তু গ্রেইল ট্যাগলিব দ্বারা উত্পন্ন হয় যা এইচটিএমএল হিসাবে jquery এ প্রেরণ করা হয়। সুতরাং আমি খাঁটি ট্যাগলিবগুলিতে সমস্ত যুক্তি যুক্ত করতে পারি না এটিকে খাঁটি কৌণিক বানাতে Angularjs তে।
রাজা

4
@ পকোজ্লোস্কি.ওপেনসোর্স, যে লিঙ্কটি মারা গেছে? এছাড়াও আপনার বাইরে থাকতে হবে।
লিয়াম

উত্তর:


115

এটি আপনাকে $compileডিএমএমে প্রবেশের আগে এইচটিএমএল স্ট্রিংয়ে কল করতে হবে যাতে কৌণিকটি বাধ্যতামূলক সম্পাদন করার সুযোগ পায়।

আপনার কৌতুকগুলিতে এটি দেখতে এমন কিছু দেখাচ্ছে।

$("#dynamicContent").html(
  $compile(
    "<button ng-click='count = count + 1' ng-init='count=0'>Increment</button><span>count: {{count}} </span>"
  )(scope)
);

স্পষ্টতই, $compileএটি কাজ করার জন্য অবশ্যই আপনার নিয়ামককে ইনজেকশনের প্রয়োজন।

$compileডকুমেন্টেশন আরও পড়ুন ।


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

4
@ রাজা যখন আপনি কৌণিক কাঠামোর বাইরে কৌণিক পদ্ধতি / এক্সপ্রেশন কল করেন তখন আপনাকে " সুযোগ" call কল করা উচিত ব্যতিক্রম পরিচালনা, ঘড়ির সম্পাদনা ইত্যাদির যথাযথ সুযোগের জীবনচক্র সম্পাদনের জন্য () প্রয়োগ করুন) jsfiddle.net/fABdD/14
আর্টেম

4
@ আর্টেমএন্ড্রিভ ঠিক ঠিক আছে। আপনার কাছে থেকে কল সরাতে পারে @Raja $scope.$apply()মধ্যে refresh()ফাংশন নিজেই যদি এটা আপনার সিস্টেমের আর্কিটেকচারের জন্য জ্ঞান করে তোলে: jsfiddle.net/nfreitas/8xkeh/1
নূহ Freitas,

4
লিংক angular-1.0.1.min.jsমূল উদাহরণ এখানে 404. ছিল @ ArtemAndreev-এস উদাহরণস্বরূপ কাজ সংস্করণ আপডেট করা হয়: jsfiddle.net/pmorch/fABdD/186 এবং @NoahFreitas উদাহরণ: jsfiddle.net/pmorch/8xkeh/43
পিটার ভি Mørch

4
একটি নিয়ামকের মধ্যে OM সংকলন এবং ডিওএম চালিয়ে যাওয়া আপনাকে অকেটেযোগ্য কোড থাকার পথে নিয়ে যাবে। DOM কখনও কোনও নিয়ামক পরিবর্তনের জন্য নির্দেশাবলী ব্যবহার করা উচিত।
এনজেয়

57

ক্ষেত্রে আর একটি সমাধান আপনার গতিশীল সামগ্রীর উপর নিয়ন্ত্রণ না রাখে

আপনি যদি কোনও উপাদান নির্দেশের মাধ্যমে আপনার উপাদান লোড না করেন তবে এটি কাজ করে (উদাহরণস্বরূপ মন্তব্য করা jsfiddles এর উদাহরণে)।

আপনার সামগ্রী মোড়ানো

আপনার বিষয়বস্তুকে একটি ডিভের মধ্যে মোড়ক করুন যাতে আপনি JQuery ব্যবহার করছেন তবে আপনি এটি নির্বাচন করতে পারেন । আপনি নিজের উপাদানটি পেতে দেশীয় জাভাস্ক্রিপ্ট ব্যবহার করার বিকল্প বেছে নিয়েছেন।

<div class="selector">
    <grid-filter columnname="LastNameFirstName" gridname="HomeGrid"></grid-filter>
</div>

কৌণিক ইনজেক্টর ব্যবহার করুন

আপনি যদি না থাকে তবে ile সংকলনের রেফারেন্স পেতে নিম্নলিখিত কোডটি ব্যবহার করতে পারেন।

$(".selector").each(function () {
    var content = $(this);
    angular.element(document).injector().invoke(function($compile) {
        var scope = angular.element(content).scope();
        $compile(content)(scope);
    });
});

সারসংক্ষেপ

মূল পোস্টটি মনে হচ্ছে আপনার কাছে একটি ile সংকলন রেফারেন্স সহজলভ্য। আপনার রেফারেন্স থাকলে স্পষ্টতই সহজ, তবে আমি তা করি না তবে এটি আমার পক্ষে উত্তর ছিল।

পূর্ববর্তী কোডের একটি ক্যাভেট

আপনি যদি মিনিপিং দৃশ্যের সাথে একটি এসপ নেট / এমভিসি বান্ডেল ব্যবহার করছেন তবে আপনি যখন রিলিজ মোডে স্থাপন করবেন তখন আপনি সমস্যায় পড়বেন। সমস্যাটি আনচাক্ট ত্রুটির আকারে আসে: [ject ইনজেক্টর: আনআরপিআর] যা কৌনিক জাভাস্ক্রিপ্ট কোডের সাথে মাইনফায়ার করে মেসিংয়ের কারণে ঘটে।

এটির প্রতিকারের উপায় এখানে :

নিম্নলিখিত ওভারলোডের সাথে প্রচলিত কোড স্নিপেটটি প্রতিস্থাপন করুন।

...
angular.element(document).injector().invoke(
[
    "$compile", function($compile) {
        var scope = angular.element(content).scope();
        $compile(content)(scope);
    }
]);
...

এটি একসাথে বেঁধে দেওয়ার আগে এটি আমার জন্য প্রচুর শোক করেছিল।


4
উপরোক্ত কোডটি আমার পক্ষে সুযোগ এবং সংকলন সম্পর্কে উপলব্ধতার জন্য ব্যাখ্যা হিসাবে কাজ করেছে বলে ধন্যবাদ। কখনও কখনও আপনি সহজ অংশগুলি মিস করেন :)
Abs

সংকলনের পরে আমাকে হজম করতে হয়েছিল।
নু

4
পরম জীবনকালীন, আমি আমার কোডে
কৌণিকের

18

@ Jwize এর উত্তরে যুক্ত করুন

কারণ angular.element(document).injector()ত্রুটি দিচ্ছিল injector is not defined তাই, আমি এমন ফাংশন তৈরি করেছি যা আপনি এজেএক্স কলের পরে চালাতে পারেন বা যখন ডকুমটি jQuery ব্যবহার করে পরিবর্তন করা হবে।

  function compileAngularElement( elSelector) {

        var elSelector = (typeof elSelector == 'string') ? elSelector : null ;  
            // The new element to be added
        if (elSelector != null ) {
            var $div = $( elSelector );

                // The parent of the new element
                var $target = $("[ng-app]");

              angular.element($target).injector().invoke(['$compile', function ($compile) {
                        var $scope = angular.element($target).scope();
                        $compile($div)($scope);
                        // Finally, refresh the watch expressions in the new element
                        $scope.$apply();
                    }]);
            }

        }

কেবলমাত্র নতুন উপাদান নির্বাচকের পাস করে এটি ব্যবহার করুন। এটার মত

compileAngularElement( '.user' ) ; 

ধন্যবাদ, এটি এমন একটি প্যাকেজ দিয়ে আমার জীবন বাঁচিয়েছে যা ইউআইকিটকে ডায়ালগগুলির জন্য ইউআইকিট ব্যবহার করে, এইচটিএমএলটি একটি $ স্কোপ ফাংশনের অভ্যন্তরে উড়ে যায় পার্শ্ব নোট হিসাবে, আমাকে আমার প্রয়োজন অনুসারে $ টার্গেটের সিলেক্টরটি পরিবর্তন করতে হয়েছিল, আমার ক্ষেত্রে $ ["" ডেটা-এনজি-কন্ট্রোলার] "), এবং comment স্কোপ.অ্যাপ্লাই (); যেহেতু এই ফাংশনটি ইতিমধ্যে একটি কৌণিক কলব্যাকে ডাকা হয়েছিল (সুতরাং
আবেদনটি

@ জোন্টার আপনি targetএটি যুক্তি থেকে গ্রহণের মাধ্যমে গতিশীলও করতে পারেন ।
shyammakwana.me
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.