কাস্টম দিকনির্দেশনার মধ্যে কীভাবে মূল্যায়ন করা বিশদগুলি পাওয়া যায়


363

আমি আমার কাস্টম নির্দেশ থেকে মূল্যায়িত বৈশিষ্ট্যটি পাওয়ার চেষ্টা করছি , তবে এটি করার সঠিক উপায়টি আমি খুঁজে পাচ্ছি না।

আমি বিস্তৃত করার জন্য এই jsFizz তৈরি করেছি ।

<div ng-controller="MyCtrl">
    <input my-directive value="123">
    <input my-directive value="{{1+1}}">
</div>

myApp.directive('myDirective', function () {
    return function (scope, element, attr) {
        element.val("value = "+attr.value);
    }
});

আমি কী মিস করছি?


নির্দেশাবলী সম্পর্কে আরও ভাল বোঝার জন্য আপনি নীচের লিঙ্কটি অনুসরণ করতে পারেন। undefinednull.com/2014/02/11/…
প্রসন্ন সাসনে

উত্তর:


573

বিজ্ঞপ্তি: আমি আরও ভাল সমাধান খুঁজে পাওয়ায় আমি এই উত্তরটি আপডেট করি। ভবিষ্যতের রেফারেন্সের জন্য আমি পুরানো উত্তরগুলি ততক্ষণ রাখি যতক্ষণ তারা সম্পর্কিত থাকে। সর্বশেষ এবং সর্বোত্তম উত্তরটি প্রথম আসে।

উত্তম উত্তর:

কৌণিক নির্দেশাবলী খুব শক্তিশালী, তবে কোন প্রক্রিয়াগুলি তাদের পিছনে রয়েছে তা বোঝার জন্য এটি সময় নেয় takes

নির্দেশিকা তৈরি করার সময়, কৌণিকতা আপনাকে প্যারেন্ট স্কোপের সাথে কিছু বাঁধাই দিয়ে একটি বিচ্ছিন্ন সুযোগ তৈরি করতে দেয় । এই বাইন্ডিং দ্বারা নির্দিষ্ট অ্যাট্রিবিউট আপনি DOM মধ্যে উপাদান সংযুক্ত এবং কিভাবে আপনি সংজ্ঞায়িত সুযোগ সম্পত্তি নির্দেশ সংজ্ঞা বস্তুর

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

angular.module("myApp", []).directive("myDirective", function () {
    return {
        restrict: "A",
        scope: {
            text: "@myText",
            twoWayBind: "=myTwoWayBind",
            oneWayBind: "&myOneWayBind"
        }
    };
}).controller("myController", function ($scope) {
    $scope.foo = {name: "Umur"};
    $scope.bar = "qwe";
});

এইচটিএমএল

<div ng-controller="myController">
    <div my-directive my-text="hello {{ bar }}" my-two-way-bind="foo" my-one-way-bind="bar">
    </div>
</div>

সেক্ষেত্রে, নির্দেশের সুযোগে (এটি লিঙ্কিং ফাংশন বা নিয়ামকের ক্ষেত্রে থাকুক না কেন), আমরা এই বৈশিষ্ট্যগুলিকে এইভাবে অ্যাক্সেস করতে পারি:

/* Directive scope */

in: $scope.text
out: "hello qwe"
// this would automatically update the changes of value in digest
// this is always string as dom attributes values are always strings

in: $scope.twoWayBind
out: {name:"Umur"}
// this would automatically update the changes of value in digest
// changes in this will be reflected in parent scope

// in directive's scope
in: $scope.twoWayBind.name = "John"

//in parent scope
in: $scope.foo.name
out: "John"


in: $scope.oneWayBind() // notice the function call, this binding is read only
out: "qwe"
// any changes here will not reflect in parent, as this only a getter .

"এখনও ঠিক আছে" উত্তর:

যেহেতু এই উত্তরটি গৃহীত হয়েছে, তবে কয়েকটি সমস্যা রয়েছে, তাই আমি এটি আরও ভাল একটিতে আপডেট করব। স্পষ্টতই, $parseএমন একটি পরিষেবা যা বর্তমান সুযোগের বৈশিষ্ট্যগুলিতে থাকে না, যার অর্থ এটি কেবল কৌণিক অভিব্যক্তি গ্রহণ করে এবং স্কোপে পৌঁছতে পারে না। {{, }}Angularjs সূচনা করার সময় এক্সপ্রেশনগুলি সংকলিত হয় যার অর্থ আমরা যখন আমাদের নির্দেশিকা postlinkপদ্ধতিতে এগুলি অ্যাক্সেস করার চেষ্টা করি তখন সেগুলি ইতিমধ্যে সংকলিত হয়। ( {{1+1}}হয় 2ইতিমধ্যে নির্দেশ মধ্যে)।

আপনি এইভাবে ব্যবহার করতে চান:

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

myApp.directive('myDirective', function ($parse) {
    return function (scope, element, attr) {
        element.val("value=" + $parse(attr.myDirective)(scope));
    };
});

function MyCtrl($scope) {
    $scope.aaa = 3432;
}​

<div ng-controller="MyCtrl">
    <input my-directive="123">
    <input my-directive="1+1">
    <input my-directive="'1+1'">
    <input my-directive="aaa">
</div>​​​​​​​​

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

এখানে খেলতে আসা ফ্রিডলটি: http://jsfiddle.net/neuTA/6/

পুরানো উত্তর:

আমার মতো ভ্রান্ত হতে পারে এমন লোকদের জন্য আমি এটি অপসারণ করছি না, মনে রাখবেন যে $evalএটি করার সঠিক পদ্ধতিটি ব্যবহার করা পুরোপুরি সূক্ষ্ম, তবে $parseভিন্ন আচরণ রয়েছে, বেশিরভাগ ক্ষেত্রে আপনার সম্ভবত এটি ব্যবহার করার প্রয়োজন হবে না।

এটি করার উপায়টি আবারও ব্যবহার করা scope.$eval। এটি কেবল কৌণিক অভিব্যক্তি সংকলন করে না, এটি বর্তমান স্কোপ এর বৈশিষ্ট্যগুলিতে অ্যাক্সেস করে।

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

myApp.directive('myDirective', function () {
    return function (scope, element, attr) {
        element.val("value = "+ scope.$eval(attr.value));
    }
});

function MyCtrl($scope) {

}​

আপনি যা মিস করছেন তা ছিল $eval

http://docs.angularjs.org/api/ng.$rootScope.Scope#$eval

ফলাফলটি ফিরিয়ে দেওয়ার বর্তমান সুযোগে অভিব্যক্তি কার্যকর করে। অভিব্যক্তিতে কোনও ব্যতিক্রম প্রচার করা হয় (অপরিবর্তিত)। কৌণিক অভিব্যক্তি মূল্যায়নের সময় এটি দরকারী।


উত্তরের জন্য ধন্যবাদ, তবে এটি সমাধান নয়। আমি আপনার কোডটি দিয়ে ফিডলটি আপডেট করেছি। jsfiddle.net/neuTA/3
শোয়ার্জ

স্কোপ ব্যবহার করার চেষ্টা করার সময় ক্রোমে আমি এই ত্রুটিটি পেয়েছি $ পার্স: অবজেক্ট # <অবজেক্ট> এর কোনও পদ্ধতি '$ পার্স' নেই। যদি আমি $ পার্স সার্ভিস - ফাংশন (ars পার্স) {রিটার্ন ফাংশন (সুযোগ ...) ইনজেক্ট করি তবে চেষ্টা করুন: "মান =" + ars পার্স (অ্যাট্রেভালিউ) - এটি আমার পক্ষে কাজ করে না বলে মনে হচ্ছে that হয়।
মার্ক রাজকক

@ মার্ক আপনি ঠিক বলেছেন, আশ্চর্যজনকভাবে এটি ফিডাল উদাহরণে ( jsfiddle.net/neuTA/4 ) কাজ করে তবে আমার যে কোডটি আছে ... কৌনিক সংস্করণগুলি নয়?
Shlomi শোয়ার্জ

2
"আরও ভাল উত্তর" বিভাগে, $scope.textসংযোগ ফাংশনটিতে অপরিজ্ঞাত করা হবে। উত্তরটি বর্তমানে যেভাবে উচ্চারণ করা হয়েছে, মনে হচ্ছে এটির সংজ্ঞা দেওয়া হয়নি। অবিচ্ছিন্নভাবে অন্তরবিচ্ছিন্ন মান দেখতে আপনাকে $ পর্যবেক্ষণ () (বা $ ঘড়ি () আসলে এখানেও কাজ করবে) ব্যবহার করতে হবে। আমার উত্তর দেখুন এবং stackoverflow.com/questions/14876112/...
মার্ক Rajcok

1
"তবুও ঠিক আছে" উত্তরে মনে হয় $parseপরিষেবাটি ইনজেকশন দেওয়া হয়েছে এবং তারপরে কখনও ব্যবহৃত হয় না। আমি কিছু অনুপস্থিত করছি?
সুপারজোজ

83

কোনও অ্যাট্রিবিউটের মানের জন্য যা কোনও বিচ্ছিন্ন সুযোগ ব্যবহার করে না এমন দিকনির্দেশনায় বিভক্ত করা প্রয়োজন, যেমন,

<input my-directive value="{{1+1}}">

বৈশিষ্ট্যগুলির পদ্ধতিটি ব্যবহার করুন $observe:

myApp.directive('myDirective', function () {
  return function (scope, element, attr) {
    attr.$observe('value', function(actual_value) {
      element.val("value = "+ actual_value);
    })
 }
});

থেকে নির্দেশ পাতা,

আন্তঃবিবাহযুক্ত বৈশিষ্ট্য পর্যবেক্ষণ: গুণাবলীর বৈশিষ্ট্যগুলির $observeমান পরিবর্তনগুলি পর্যবেক্ষণ করতে ব্যবহার করুন (উদাহরণস্বরূপ src="{{bar}}")। কেবল এটিই খুব দক্ষ নয় তবে এটি সহজেই আসল মান পাওয়ার একমাত্র উপায় কারণ সংযোগের সময়টি অন্তরঙ্গটি এখনও মূল্যায়ন করা হয়নি এবং তাই মানটি এই সময়ে সেট করা আছে undefined

যদি বৈশিষ্ট্যটির মানটি কেবল একটি ধ্রুবক, উদাহরণস্বরূপ,

<input my-directive value="123">

আপনি মানটি বা বুলিয়ান মান হিসাবে al eval ব্যবহার করতে পারেন এবং আপনি সঠিক প্রকারটি চান:

return function (scope, element, attr) {
   var number = scope.$eval(attr.value);
   console.log(number, number + 1);
});

যদি বৈশিষ্ট্যটির মানটি একটি স্ট্রিং ধ্রুবক হয়, বা আপনি মানটি আপনার নির্দেশিকায় স্ট্রিং টাইপ করতে চান তবে আপনি সরাসরি এটি অ্যাক্সেস করতে পারেন:

return function (scope, element, attr) {
   var str = attr.value;
   console.log(str, str + " more");
});

আপনার ক্ষেত্রে যাইহোক, আপনি যেহেতু ইন্টারপোল্টেড মান এবং ধ্রুবককে সমর্থন করতে চান তাই ব্যবহার করুন $observe


আপনি কি একমাত্র সমাধানটি খুঁজে পেলেন?
Shlomi শোয়ার্জ

4
হ্যাঁ, এবং যেহেতু নির্দেশিকা পৃষ্ঠা এই পদ্ধতির সুপারিশ করে, তাই আমি এটি এটি করব।
চিহ্নিত করুন রাজকোক

7
+1, এটি সেরা উত্তর আইএমও যেহেতু এটি নির্দেশের কোনও সুযোগকে জোর করে না এবং $ পর্যবেক্ষণ সহ গুণাবলী পরিবর্তনগুলিও অন্তর্ভুক্ত করে
BiAiB

4

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

my-directive-name="['string1', 'string2']"

সেক্ষেত্রে আপনি তাড়া করতে পারবেন এবং একটি দুর্দান্ত বেসিক ব্যবহার করতে পারেন angular.$eval(attr.attrName)

element.val("value = "+angular.$eval(attr.value));

ওয়ার্কিং বেহালার


আমি জানি না আপনি কোনও পুরনো কৌনিক সংস্করণ ব্যবহার করেছেন কিনা বা কী নয় তবে আপনার সমস্ত কোডের নমুনাগুলি হয় অবৈধ জাভাস্ক্রিপ্ট (আমার-নির্দেশিকা-নাম =) বা অবৈধ কৌনিক (কৌণিক $ ইওল উপস্থিত নেই), তাই -1
বিআইআইবি

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

$ সুযোগ। $ eval (অ্যাটরওয়াল) কৌণিক 1.4 এ কাজ করে। নির্দেশের লিঙ্ক ফাংশনে ইনজেকশনের জন্য $ স্কোপ প্রয়োজন।
মার্টিন কনেল

4

একই সমাধানের জন্য আমি খুঁজছিলাম Angularjs directive with ng-Model
সমস্যা সমাধানের কোডটি এখানে।

    myApp.directive('zipcodeformatter', function () {
    return {
        restrict: 'A', // only activate on element attribute
        require: '?ngModel', // get a hold of NgModelController
        link: function (scope, element, attrs, ngModel) {

            scope.$watch(attrs.ngModel, function (v) {
                if (v) {
                    console.log('value changed, new value is: ' + v + ' ' + v.length);
                    if (v.length > 5) {
                        var newzip = v.replace("-", '');
                        var str = newzip.substring(0, 5) + '-' + newzip.substring(5, newzip.length);
                        element.val(str);

                    } else {
                        element.val(v);
                    }

                }

            });

        }
    };
});


এইচটিএমএল ডোম

<input maxlength="10" zipcodeformatter onkeypress="return isNumberKey(event)" placeholder="Zipcode" type="text" ng-readonly="!checked" name="zipcode" id="postal_code" class="form-control input-sm" ng-model="patient.shippingZipcode" required ng-required="true">


আমার ফলাফলটি হ'ল:

92108-2223

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

myApp .directive('myDirective', function ($timeout) {
    return function (scope, element, attr) {
        $timeout(function(){
            element.val("value = "+attr.value);
        });

    }
});

function MyCtrl($scope) {

}

Changes টাইমআউট ব্যবহার করুন কারণ ডম লোডের পরে নির্দেশক কল যাতে আপনার পরিবর্তনগুলি প্রয়োগ হয় না

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