নকআউটজেএস-এর জন্য টেমপ্লেট বাঁধাইয়ের ত্রুটিগুলি কীভাবে ডিবাগ করবেন?


199

নকআউটজেএস টেমপ্লেটগুলিতে ডিবাগিংয়ের সমস্যায় আমি সমস্যা বজায় রাখি।

বলুন আমি " items" নামক কোনও সম্পত্তির সাথে আবদ্ধ হতে চাই তবে টেমপ্লেটে আমি একটি টাইপ তৈরি করে (অস্তিত্বহীন) সম্পত্তিটিকে আবদ্ধ করি " item"।

ক্রোম ডিবাগারটি কেবল আমাকে বলে:

"item" is not defined.

বাঁধাই সমস্যা সম্পর্কে আরও তথ্য পেতে আমাকে কী এমন সরঞ্জাম, কৌশল বা কোডিং শৈলী রয়েছে?

উত্তর:


344

একটি নির্দিষ্ট বিষয় যা আমি যখন প্রায়শই একটি নির্দিষ্ট সুযোগে ডেটা উপলভ্য হয় তা নিয়ে টেমপ্লেট / বিভাগটি এমন কিছুর সাথে প্রতিস্থাপন করা হয় তবে আমি প্রায়শই এটি করি:

<div data-bind="text: ko.toJSON($data)"></div>

অথবা, আপনি যদি আরও কিছু পাঠযোগ্য সংস্করণ চান:

<pre data-bind="text: JSON.stringify(ko.toJS($data), null, 2)"></pre>

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

আপডেট: কেও ২.১ হিসাবে , আপনি এটিকে সহজ করতে পারেন:

<pre data-bind="text: ko.toJSON($data, null, 2)"></pre>

এখন যুক্তিগুলি দেওয়া হয় JSON.stringify


ওহ। আমারও এই প্রশ্নটি জিজ্ঞাসা করা দরকার। কনসোল.লগ ডেটাতে কোডের জটিল টুকরা ব্যবহার করা হয়েছে। এখন এটা অনেক সহজ।
AlfeG

3
আমাকে ডিবাগিং টিপস সম্পর্কে আরও চিন্তা করতে হবে এবং সম্ভবত একটি ব্লগ পোস্ট করতে হবে। অন্য যেটি মনে আসে তা হ'ল মান পরিবর্তনগুলি দেখার জন্য পর্যবেক্ষণযোগ্য বা গণনা করা পর্যবেক্ষকদের বিরুদ্ধে ম্যানুয়াল সাবস্ক্রিপশন করা। ভালো লেগেছে যদি nameপর্যবেক্ষণযোগ্য হয়name.subscribe(function(newValue) { console.log("name", newValue); });
আরপি নিমিমায়ার

1
হতে পারে কারণ এই উত্তরটি তুলনামূলকভাবে পুরানো, তবে কেন কনসোল.লগ ব্যবহার করবেন না এবং অবজেক্টের বৈশিষ্ট্য দেখার জন্য ডিবাগারের সম্পূর্ণ শক্তি ব্যবহার করবেন না? যেমন দেখুন: স্ট্যাকওভারফ্লো.com
ডার্ক বোয়ার

1
@ ডির্কবোয়ার - কনসোল.লগ ব্যবহার করাও দুর্দান্ত উপায় হতে পারে। অনেক সময় আমি আমার foreachদৃশ্যের মতো আমার উপাদানগুলির পাশের ডেটা দেখতে চাইলেও দেখতে পাই এবং কনসোলের মাধ্যমে চালনার চেয়ে প্রাসঙ্গিক রেন্ডারড মার্কআপের মধ্যে পৃষ্ঠাটিতে দেখতে আরও সহজ মনে করি। শুধু পরিস্থিতির উপর নির্ভর করে। আমার আরও কিছু ধারণা এখানে: knockmeout.net/2013/06/… । এছাড়াও, আপনি আপনার বাঁধাইয়ের মতো "ক্লিন" সংস্করণ লগ করতে চাইতে পারেন console.log(ko.toJS(valueAccessor())
আরপি নেইমায়ার

1
@ রুনজেপ্পেসেন - আপনি কোন ধরণের ডেটা সিরিয়ালাইজ করছেন তা আমি নিশ্চিত নই, তবে এর মতো কিছু সাহায্য করতে পারে: নকআউটআউট.এন.সি.২০১০
আরপি

61

আপনি যদি ক্রোমকে উন্নয়নের জন্য ব্যবহার করেন তবে নকউটজস কনটেক্সট ডিবাগার নামে একটি সত্যই দুর্দান্ত এক্সটেনশন রয়েছে (যার সাথে আমি অনুমোদিত নয়) যা আপনাকে সরাসরি বিকাশকারী সরঞ্জামগুলির এলিমেন্টস প্যানেলে বাধ্যতামূলক প্রসঙ্গ দেখায়।


3
আমার ইচ্ছা ফায়ারফক্স বা ফায়ারবগের কাছে এটি ছিল। এমন জিনিস কেউ জানেন?
প্যাট্রিক জাজালাপস্কি

উপস্থিত সমর্থন বাদ দেওয়া হয়েছে। আপনি যদি কোনও জটিল ডেটা-বাইন্ড কাঠামো ব্যবহার করেন তবে ক্রোম ক্রাশের কারণ ঘটায়। প্রায় এক বছর ধরে আমার কোনও প্রকল্পের জন্য কাজ করেনি।
আর্কটিক

এটি শুনে দুঃখিত, যদিও আমি দীর্ঘদিন ধরে কেও থেকে এমবারে চলে এসেছি।
কখনই ফক্স

1
এটি আমার জন্য বেশিরভাগ ক্ষেত্রেই কাজ করে (বেশিরভাগ ক্ষেত্রে) এবং আমার কিছু জটিল কাঠামো রয়েছে। আমি এটি চেষ্টা করে দেখিনি তবে এক্সটেনশনের বিকল্পগুলিতে এটি প্রস্তাব দেয়, "যদি আপনি ক্র্যাশ করে থাকেন তবে প্রস্তাবিতভাবে একটি অ সিরিয়ালাইজযোগ্য ভিউমডেল রয়েছে You আপনি সিরিয়ালটি বন্ধ করতে পারেন।" এই বৈশিষ্ট্যটি অক্ষম করার জন্য বার্তার নীচে একটি চেকবক্স রয়েছে।
গ্রিন

তাত্ক্ষণিকভাবে তাত্ক্ষণিকভাবে কার্যকর
অ্যান্ড্রু

37

আপনার জাভাস্ক্রিপ্ট লাইব্রেরি ফাইলের কোথাও একবার একটি বাইন্ডিংহ্যান্ডলার সংজ্ঞা দিন

ko.bindingHandlers.debug = 
{
    init: function(element, valueAccessor) 
    {
        console.log( 'Knockoutbinding:' );
        console.log( element );
        console.log( ko.toJS(valueAccessor()) );
    }
};

কেবল ব্যবহারের চেয়ে এটি পছন্দ করে:

<ul data-bind="debug: $data">

সুবিধাদি

  • এলিমেন্টস প্যানেলে প্রকাশের মতো ক্রোম ডিবাগারের সম্পূর্ণ শক্তি ব্যবহার করুন
  • আপনার ডিওমে কাস্টম উপাদান যুক্ত করতে হবে না, কেবল ডিবাগিংয়ের জন্য

এখানে চিত্র বর্ণনা লিখুন


32

আমি আর একটি পেয়েছি যা সহায়ক হতে পারে। আমি কিছু বাইন্ডিং ডিবাগ করছিলাম এবং রায়ান উদাহরণ ব্যবহার করার চেষ্টা করছিলাম। আমি একটি ত্রুটি পেয়েছি যে জেএসওএন একটি বিজ্ঞপ্তি লুপ পেয়েছে।

<ul class="list list-fix" data-bind="foreach: detailsView().tabs">
 <li>
   <pre data-bind="text: JSON.stringify(ko.toJS($parent), null, 2)"></pre>
   <a href="#" data-bind="click: $parent.setActiveTab, text: title"></a>
 </li>
</ul>

তবে, এই পদ্ধতির ব্যবহার করে নিম্নলিখিতগুলির সাথে ডেটা-বাইন্ডের প্রতিস্থাপনের মানটি প্রতিস্থাপন করা হয়েছে:

  <ul class="list list-fix" data-bind="foreach: detailsView().tabs">
    <li>
      <pre data-bind="text: 'click me', click: function() {debugger}"></pre>
      <a href="#" data-bind="click: $parent.setActiveTab, text: title"></a>
    </li>
  </ul>

এখন আমি ক্রোম ডিবাগ উইন্ডোটি খোলা থাকার সময় যদি PRE উপাদানটিতে ক্লিক করি তবে আমি একটি সুন্দরভাবে ভরাট স্কোপ ভেরিয়েবল উইন্ডোটি পাই।

এটির জন্য একটু ভাল উপায় খুঁজে পেয়েছে:

<pre data-bind="text: ko.computed(function() { debugger; })"></pre>

সত্যিই দরকারী। <প্রাক ডেটা-বাইন্ড = "পাঠ্য: ko.toJSON ($ ডেটা, নাল, 2)"> </ translation> ব্যবহার করে নকআউট সার্কুলার লুপগুলি এবং রেজার মার্কআপ সমস্যার মুখোমুখি হয়েছিল। <প্রাক ... ডিবাগার> একটি নিখুঁত কাজ ound কোনও কারণে @ এইচটিএমএল.চেকবক্সের মতো রেজার ইনপুটগুলি কো.টি.জে জেএসএন ভাঙছিল।
আর্কটিক

20

ধাপে ধাপে গাইড

  1. এই গাইডের জন্য, আমরা অফিসিয়াল নকআউটজেএস উদাহরণগুলির মধ্যে একটি ব্যবহার করব ।
  2. বলুন আপনি দ্বিতীয় পরিচিতির (সেন্সেই মিয়াগি) পেছনের ডেটা দেখতে চান।
  3. দ্বিতীয় পরিচিতির প্রথম ইনপুট বাক্সে ডান-ক্লিক করুন ('সেন্সেই' পাঠ্য সহ একটি)।
  4. 'পরিদর্শন উপাদান' নির্বাচন করুন। Chrome বিকাশকারী সরঞ্জামদণ্ডটি খুলবে।
  5. জাভাস্ক্রিপ্ট কনসোল উইন্ডোটি খুলুন। আপনি >=ক্রোম বিকাশকারী সরঞ্জামদণ্ডের নীচে-বামে আইকনটি ক্লিক করে বা Chrome বিকাশকারী সরঞ্জামদণ্ডে "কনসোল" ট্যাবটি খুলতে বা Ctrl+ Shift+ টিপে কনসোল অ্যাক্সেস করতে পারবেনJ
  6. নিম্নলিখিত কমান্ডটি টাইপ করুন এবং এন্টার টিপুন: ko.dataFor($0)
  7. এখন আপনার দ্বিতীয় সারিতে আবদ্ধ ডেটা দেখতে হবে। আপনি অবজেক্ট ট্রিটি নেভিগেট করতে অবজেক্টের বামদিকে সামান্য ত্রিভুজ টিপে তথ্য প্রসারিত করতে পারেন।
  8. নিম্নলিখিত কমান্ডটি টাইপ করুন এবং এন্টার টিপুন: ko.contextFor($0)
  9. আপনার এখন একটি জটিল অবজেক্ট দেখতে পাওয়া উচিত যার মধ্যে মূল এবং সমস্ত পিতামাতাসহ পুরো নকআউট প্রসঙ্গ রয়েছে। যখন আপনি জটিল বাইন্ডিং এক্সপ্রেশন লিখছেন এবং আপনি বিভিন্ন নির্মাণের সাথে পরীক্ষা করতে চান তখন এটি কার্যকর।

উপরোক্ত গাইড অনুসরণ করার সময় আউটপুট উদাহরণ

এই কালো যাদু কি?

এই কৌশলটি ক্রোমের $ 0- $ 4 বৈশিষ্ট্য এবং নকআউটজেএসের ইউটিলিটি পদ্ধতির সংমিশ্রণ । সংক্ষেপে বলতে গেলে, ক্রোম স্মরণ যা উপাদান আপনি Chrome বিকাশকারী সরঞ্জাম দণ্ডের মধ্যে নির্বাচন করেছেন এবং ওরফে অধীনে এই উপাদান প্রকাশ $0, $1, $2, $3, $4। সুতরাং যখন আপনি আপনার ব্রাউজারে একটি উপাদান ডান ক্লিক করুন এবং নির্বাচন করুন 'পরিদর্শন উপাদান', এই উপাদান স্বয়ংক্রিয়ভাবেই আপনার ওরফে অধীনে উপলব্ধ $0। আপনি এই কৌশলটি নকআউটজেএস, অ্যাঙ্গুলারজেএস, জিকুয়ারি বা অন্য কোনও জাভাস্ক্রিপ্ট ফ্রেমওয়ার্কের সাহায্যে ব্যবহার করতে পারেন।

কৌতুকের অন্য দিকটি হ'ল নকআউটজেএস-এর ইউটিলিটি পদ্ধতিগুলি ko.dataFor এবং ko.context For:

  • ko.dataFor(element) - উপাদানটির বাইন্ডিংয়ের জন্য যে ডেটা পাওয়া যায় তা ফিরিয়ে দেয়
  • ko.contextFor(element) - পুরো বাঁধাই প্রসঙ্গটি প্রদান করে যা ডম উপাদান হিসাবে উপলব্ধ ছিল।

মনে রাখবেন, ক্রোমের জাভাস্ক্রিপ্ট কনসোল পুরোপুরি কার্যকরী জাভাস্ক্রিপ্ট রানটাইম পরিবেশ environment এর অর্থ হ'ল আপনি কেবল ভেরিয়েবলের সন্ধানে সীমাবদ্ধ নন। আপনি ko.contextForকনসোল থেকে সরাসরি ভিউ মডেলটির আউটপুট সঞ্চয় করতে এবং পরিচালনা করতে পারেন । চেষ্টা করুন var root = ko.contextFor($0).$root; root.addContact();এবং দেখুন :-)

শুভ ডিবাগিং!


7

আমি ব্যবহার করি এমন একটি সাধারণ জিনিস পরীক্ষা করে দেখুন :

function echo(whatever) { debugger; return whatever; }

অথবা

function echo(whatever) { console.log(whatever); return whatever; }

তারপরে এইচটিএমএলে, বলুন, আপনি ছিলেন:

<div data-bind="text: value"></div>

কেবল এটির সাথে প্রতিস্থাপন করুন

<div data-bind="text: echo(value)"></div>

আরো উন্নত:

function echo(vars, member) { console.log(vars); debugger; return vars[0][member]; }

<div data-bind="text: echo([$data, $root, $parents, $parentContext], 'value')"></div>

উপভোগ করুন :)

হালনাগাদ

আরেকটি বিরক্তিকর বিষয় হ'ল আপনি যখন কোনও অপরিজ্ঞাত মানকে বাঁধতে চেষ্টা করছেন। উপরের উদাহরণে কল্পনা করুন যে ডেটা অবজেক্টটি কেবল {} মান নয়: 'কিছু পাঠ্য'}} এক্ষেত্রে আপনি সমস্যায় পড়বেন তবে নীচের টুইটের মাধ্যমে আপনি ভাল থাকবেন:

<div data-bind="text: $data['value']"></div> 

5

আমি এই ত্রুটিগুলি কল্পনা করতে সহায়তা করার জন্য নকথ্রুজ.জেস নামে একটি গিথুব প্রকল্প তৈরি করেছি।

https://github.com/JonKragh/knockthrough

এটি বাইন্ডিং ত্রুটিগুলি হাইলাইট করে এবং সেই নোডের উপর ডেটাাকন্টেক্সটের একটি ডাম্প দেয়।

আপনি এখানে একটি নমুনা নিয়ে খেলতে পারেন: http://htmlpreview.github.io/?https://github.com/JonKragh/knockthrough/blob/master/default.htm

এখানে চিত্র বর্ণনা লিখুন

আমাকে এই পর্যায়ে পৌঁছে দেওয়ার জন্য আরপি নিমিমায়ারকে তার দুর্দান্ত নকআউট কোড নমুনার জন্য ক্রেডিট।


3

কোন তথ্যটি বাইন্ডিংয়ে পাস হয় তা দেখার সহজ উপায় হ'ল কনসোলে ডেটা ফেলে দেওয়া:

<div data-bind="text: console.log($data)"></div>

নকআউট পাঠ্য বাঁধার জন্য মানটি মূল্যায়ন করবে (যে কোনও বাঁধাই বাস্তবে এখানে ব্যবহার করা যেতে পারে ) এবং ব্রাউজার প্যানেলটি কনসোল করতে fl ডেটা ফ্লাশ করে।


2

অন্যান্য সমস্ত উত্তর দুর্দান্ত কাজ করবে, আমি যা করতে চাই তা যুক্ত করছি:

আপনার দৃষ্টিতে (ধরে নিলেন আপনি ইতিমধ্যে একটি ভিউমোডেলকে আবদ্ধ করেছেন):

<div data-bind="debugger: $data"></div>

নকআউট কোড:

ko.bindingHandlers.debugger = {
    init: function (element, valueAccessor) {
        debugger;
    }
}

এটি ডিবাগারে কোডটি বিরতি দেবে elementএবং valueAccessor()এতে মূল্যবান তথ্য থাকবে।


কাস্টম বাইন্ডিংয়ের দরকার নেই। কটাক্ষপাত stackoverflow.com/documentation/knockout.js/5066/...
আদম Wolski

1
হ্যাঁ, আমি একমত যে এইভাবে করার দরকার নেই, আমি কেবল এটি উল্লেখ করতে চেয়েছিলাম যে এটি একটি ডিবাগিং স্টাইল ... প্রত্যেকে নিজের নিজের উপায়ে এটি করা পছন্দ করবে :)
আদিত্য এমপি

1

আপনি যদি ভিজ্যুয়াল স্টুডিও এবং আই-তে বিকাশ করছেন তবে data-bind="somebinding:(function(){debugger; return bindvalue; })()"আমি এটিকে আরও পছন্দ করি তবে এটি প্রতিধ্বনি ফাংশন যেহেতু এটি স্ক্রিপ্টে সমস্ত বাইন্ডিংয়ের পরিবর্তে fileভাল ফাইলের সাথে যাবে এবং আপনি কেবলমাত্র $ প্রসঙ্গ $ ডেটা দেখতে পারেন (আমি ব্যবহার করি) এটি ক্রোমেও রয়েছে);


আমি বাজি ধরছি ভিজ্যুয়াল স্টুডিও বা আইই এর সাথে এর কোনও যোগসূত্র নেই।
সেরিহ

@ সেরি ক্রোমের সাথে একই তবে ক্রোমে আমি মনে করি আপনি এটিটি ছাড়াই ফাইলটি অ্যাক্সেস করতে পারতেন বলে আমি মনে করি না আপনি ভিএস-তে ফাইল অ্যাক্সেস করতে পারবেন I
ফিলিপ কর্ডাস

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