কৌণিক 2 ব্যতিক্রম: এটি 'রাউটারলিঙ্ক'-এ আবদ্ধ হতে পারে না কারণ এটি কোনও পরিচিত দেশীয় সম্পত্তি নয়


277

স্পষ্টতই Angular2 এর জন্য বিটা নতুনের চেয়েও নতুন, সুতরাং খুব বেশি তথ্য নেই, তবে আমি যা চেষ্টা করি তা করার চেষ্টা করছি কিছুটা বেসিক রাউটিং।

Https://angular.io ওয়েবসাইট থেকে দ্রুত-প্রারম্ভিক কোড এবং অন্যান্য স্নিপেটগুলি নিয়ে হ্যাকিংয়ের ফলে নিম্নলিখিত ফাইলের কাঠামো তৈরি হয়েছে:

angular-testapp/
    app/
        app.component.ts
        boot.ts
        routing-test.component.ts
    index.html

ফাইলগুলি নিম্নরূপে পপুলেশনের সাথে:

index.html

<html>

  <head>
    <base href="/">
    <title>Angular 2 QuickStart</title>
    <link href="../css/bootstrap.css" rel="stylesheet">

    <!-- 1. Load libraries -->
    <script src="node_modules/angular2/bundles/angular2-polyfills.js"></script>
    <script src="node_modules/systemjs/dist/system.src.js"></script>
    <script src="node_modules/rxjs/bundles/Rx.js"></script>
    <script src="node_modules/angular2/bundles/angular2.dev.js"></script>
    <script src="node_modules/angular2/bundles/router.dev.js"></script>

    <!-- 2. Configure SystemJS -->
    <script>
      System.config({
        packages: {        
          app: {
            format: 'register',
            defaultExtension: 'js'
          }
        }
      });
      System.import('app/boot')
            .then(null, console.error.bind(console));
    </script>

  </head>

  <!-- 3. Display the application -->
  <body>
    <my-app>Loading...</my-app>
  </body>

</html>

boot.ts

import {bootstrap}    from 'angular2/platform/browser'
import {ROUTER_PROVIDERS} from 'angular2/router';

import {AppComponent} from './app.component'

bootstrap(AppComponent, [
    ROUTER_PROVIDERS
]);

app.component.ts

import {Component} from 'angular2/core';
import {RouteConfig, ROUTER_DIRECTIVES, ROUTER_PROVIDERS, LocationStrategy, HashLocationStrategy} from 'angular2/router';

import {RoutingTestComponent} from './routing-test.component';

@Component({
    selector: 'my-app',
    template: `
        <h1>Component Router</h1>
        <a [routerLink]="['RoutingTest']">Routing Test</a>
        <router-outlet></router-outlet>
        `
})

@RouteConfig([
    {path:'/routing-test', name: 'RoutingTest', component: RoutingTestComponent, useAsDefault: true},
])

export class AppComponent { }

রাউটিং-test.component.ts

import {Component} from 'angular2/core';
import {Router} from 'angular2/router';

@Component({
    template: `
        <h2>Routing Test</h2>
        <p>Interesting stuff goes here!</p>
        `
})
export class RoutingTestComponent { }

এই কোডটি চালানোর চেষ্টা ত্রুটিটি উত্পন্ন করে:

EXCEPTION: Template parse errors:
Can't bind to 'routerLink' since it isn't a known native property ("
        <h1>Component Router</h1>
        <a [ERROR ->][routerLink]="['RoutingTest']">Routing Test</a>
        <router-outlet></router-outlet>
        "): AppComponent@2:11

আমি এখানে একটি অস্পষ্ট সম্পর্কিত সমস্যা খুঁজে পেয়েছি; রাউটার-লিঙ্কের নির্দেশগুলি অ্যাঙ্গুলার ২.০.০-বিটা.0 এ আপগ্রেড করার পরে ভেঙে গেছে । যাইহোক, উত্তরের একটিতে "কার্যকারী উদাহরণ" প্রাক-বিটা কোডের উপর ভিত্তি করে - যা এখনও ভালভাবে চলতে পারে তবে আমি যে কোডটি তৈরি করেছি তা কেন কাজ করছে না তা জানতে চাই।

যে কোনও পয়েন্টার কৃতজ্ঞভাবে গ্রহণ করা হবে!


4
অন্য প্রশ্ন ভিন্ন কিছু আছে: directives: [ROUTER_DIRECTIVES]
এরিক মার্টিনেজ

1
এমনকি ROUTER_DIRECTIVES দিয়েও আমি একই ত্রুটি পাচ্ছি। @Component({selector: "app"}) @View({templateUrl: "app.html", directives: [ROUTER_DIRECTIVES, RouterLink]})
ফিল

8
directives: [ROUTER_DIRECTIVES][রাউটার-লিঙ্ক] থেকে [রাউটার লিঙ্ক] এ সংযোজন এবং পরিবর্তন করে আমি আর ত্রুটি পাচ্ছি না।
ফিলি

উত্তর:


392

> = RC.5

আমদানি RouterModule দেখুন https://angular.io/guide/router

@NgModule({ 
  imports: [RouterModule],
  ...
})

> = RC.2

app.routes.ts

import { provideRouter, RouterConfig } from '@angular/router';

export const routes: RouterConfig = [
  ...
];

export const APP_ROUTER_PROVIDERS = [provideRouter(routes)];

main.ts

import { bootstrap } from '@angular/platform-browser-dynamic';
import { APP_ROUTER_PROVIDERS } from './app.routes';

bootstrap(AppComponent, [APP_ROUTER_PROVIDERS]);

<= RC.1

আপনার কোড অনুপস্থিত

  @Component({
    ...
    directives: [ROUTER_DIRECTIVES],
    ...)}

আপনি routerLinkবা মত নির্দেশাবলী ব্যবহার করতে পারবেন নাrouter-outlet আপনার উপাদানগুলির পরিচিত করে সেগুলি ছাড়াই ।

নির্দেশিক নামগুলি অ্যাঙ্গুলার 2 এ কেস-সংবেদনশীল হিসাবে পরিবর্তিত করা হয়েছিল, তবুও উপাদানগুলিতে -নাম ব্যবহার করা <router-outlet>ওয়েব-উপাদানগুলির সাথে সামঞ্জস্যপূর্ণ হতে পছন্দ করে যার জন্য প্রয়োজনীয়- কাস্টম উপাদানগুলির নামে

বিশ্বব্যাপী নিবন্ধন করুন

ROUTER_DIRECTIVESবিশ্বব্যাপী উপলভ্য করতে , এই সরবরাহকারীটিকে এতে যুক্ত করুন bootstrap(...):

provide(PLATFORM_DIRECTIVES, {useValue: [ROUTER_DIRECTIVES], multi: true})

তাহলে ROUTER_DIRECTIVESপ্রতিটি উপাদান যুক্ত করার দরকার নেই no


1
হ্যাঁ আপনি নিজের অ্যাপ্লিকেশনটিকে বুটস্ট্র্যাপ করার সময়ও একাধিক নির্দেশনা বরাদ্দ করতে পারেন: -provide(PLATFORM_DIRECTIVES, {useValue: [ROUTER_DIRECTIVES, FORM_DIRECTIVES, ETC...], multi: true})
পারদীপ জৈন

1
এটি ঠিক, তবে FORM_DIRECTIVESএটি PLATFORM_DIRECTIVESইতিমধ্যে ডিফল্টরূপে অন্তর্ভুক্ত রয়েছে ।
গন্টার জ্যাচবাউয়ার

2
এটি দুর্দান্ত ছিল, ধন্যবাদ। এগুলি
জেফ

হয়তো এখানে একটি বোকা প্রশ্ন, কিন্তু আরসি 1, আরসি 2 এখানে কি? আমি কৌনিক ২.১.২ ব্যবহার করছি, এটি কোন আরসি?
জিয়ান চেন

1
@ আলেকজান্ডারমিলস কেন পুরানো আন্ডাররা আপনাকে ভয় দেখায়? পুরানো উত্তরগুলি যুদ্ধ-পরীক্ষিত এবং অতএব খুব বিশ্বাসযোগ্য; পি
গন্টার জ্যাচবাউর

116

যাদের কাছে এই এটি যখন কারণ এর মাধ্যমে চালানো পরীক্ষায় করার প্রচেষ্টার জন্য npm testবা ng testকর্মফল বা অন্য যাই হোক না কেন ব্যবহার করে। আপনার .spec মডিউলটি তৈরি করতে সক্ষম হতে একটি বিশেষ রাউটার পরীক্ষার আমদানি প্রয়োজন।

import { RouterTestingModule } from '@angular/router/testing';

TestBed.configureTestingModule({
    imports: [RouterTestingModule],
    declarations: [AppComponent],
});

http://www.kirjai.com/ng2-component-testing-routerlink-routeroutlet/


2
এটি একটি দুর্দান্ত ক্যাচ! আমার প্রকল্পটিতে সাধারণ অপারেশন নিয়ে কোনও সমস্যা হচ্ছিল না, specফাইলটিতে এটি যুক্ত করতে হয়েছিল । ধন্যবাদ @ রাইক্রো!
kbpontius

1
পাশাপাশি কৌণিক 4 এ কাজ করার বিষয়ে নিশ্চিত হয়েছেন। এর জন্য ধন্যবাদ!
জিসিসার

এটি অবশ্যই স্বীকৃত উত্তর হতে হবে, গ্রহণযোগ্য উত্তরটি ভুল, কারণ আমদানি করার সময় RouterModule, আপনাকে forRootমডিউলটি সন্তুষ্ট করার জন্য কল করতে হবে এবং তারপরে আপনাকে সরবরাহ করা উচিত BASE_HREF...
মিলাদ

1
এটি কৌনিক 5+ এর জন্য পৃথক কিনা আপনার কোনও ধারণা আছে? আমি Can't bind to 'active' since it isn't a known property of 'a'.আমার বেশ কয়েকটি ইউনিট পরীক্ষায় অনুরূপ ত্রুটি পেয়েছি এবং আমদানি করেছি RouterTestingModule
স্টুয়ার্ট উপডেগ্রেভ

25

ভিজ্যুয়াল স্টুডিও (2013) এর সাথে কোড করার সময় সাবধানতার শব্দ

এই ত্রুটিটি ডিবাগ করার চেষ্টা করে আমি 4 থেকে 5 ঘন্টা নষ্ট করেছি। চিঠির সাহায্যে স্ট্যাকওভারফ্লোতে আমি যে সমস্ত সমাধান পেয়েছি সেগুলি চেষ্টা করেছিলাম এবং আমি এখনও এই ত্রুটি পেয়েছি:Can't bind to 'routerlink' since it isn't a known native property

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

এই:

<div>
    <a [routerLink]="['/catalog']">Catalog</a>
    <a [routerLink]="['/summary']">Summary</a>
</div>

হয়ে:

<div>
    <a [routerlink]="['/catalog']">Catalog</a>
    <a [routerlink]="['/summary']">Summary</a>
</div>

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


4
আপনাকে ধন্যবাদ, আপনি "রাউটারলিঙ্ক" বনাম "রাউটারলিঙ্ক" এর মধ্যে পার্থক্যটি উল্লেখ করতে পারতেন। কৌনিক 2 "রাউটারলিঙ্ক" উপস্থিত থাকার প্রত্যাশা করে তবে "রাউটারলিঙ্ক" খুঁজে পেয়েছে
নরেন্দ্রন সোলাই

ধন্যবাদ, কোনও কারণে, কিছু টিউটোরিয়াল মাঝখানে ড্যাশ সহ "রাউটার-লিঙ্ক" ব্যবহার করেছে। তবে রাউটারলিঙ্কটি সঠিক সংস্করণ।
উইন্ডমায়াও

ওয়েবপ্যাক এবং এইচটিএমএল-মিনিফায়ারের ক্ষেত্রে একই ঘটনা ঘটে তবে কেবল উত্পাদন হয়। কেস যুক্ত করুন সংবেদনশীল: এইচটিএমএল-লোডার অপশনগুলির সাথে সত্য দেখুন: github.com/SamanthaAdrichem/webpack-3.9.1 -splitted-config
সামান্থা অ্যাড্রিচেম

12

>> ভি 5 এর জন্য

import { RouterModule, Routes } from '@angular/router';

const appRoutes: Routes = [
  {path:'routing-test', component: RoutingTestComponent}
];

@NgModule({
  imports: [
    RouterModule.forRoot(appRoutes)
    // other imports here
  ]
})

উপাদান:

@Component({
    selector: 'my-app',
    template: `
        <h1>Component Router</h1>
        <a routerLink="/routing-test" routerLinkActive="active">Routing Test</a>
        <router-outlet></router-outlet>
        `
})

<ভি 5 এর জন্য

এছাড়াও RouterLinkযেমন হিসাবে ব্যবহার করতে পারেন directivesdirectives: [RouterLink]। যে আমার জন্য কাজ করে

import {Router, RouteParams, RouterLink} from 'angular2/router';

@Component({
    selector: 'my-app',
    directives: [RouterLink],
    template: `
        <h1>Component Router</h1>
        <a [routerLink]="['RoutingTest']">Routing Test</a>
        <router-outlet></router-outlet>
        `
})

@RouteConfig([
    {path:'/routing-test', name: 'RoutingTest', component: RoutingTestComponent, useAsDefault: true},
])

আমি মনে করি না এটি আর প্রয়োগ হয় (কৌণিক 5) ইত্যাদি
আলেকজান্ডার মিলস

10

সাধারণভাবে, যখনই আপনি এর মতো ত্রুটি পান Can't bind to 'xxx' since it isn't a known native property, সম্ভবত সম্ভাব্য কারণটি কোনও উপাদান বা নির্দেশকে (বা একটি ধ্রুবকতে উপাদান বা নির্দেশকে অন্তর্ভুক্ত) নির্দিষ্ট করতে ভুলে যাচ্ছেনdirectives মেটাডেটা অ্যারেতে । এখানে যেমন ঘটনা।

যেহেতু আপনি নির্দিষ্ট RouterLinkবা ধ্রুবক নির্দিষ্ট করেন নি ROUTER_DIRECTIVES- যার মধ্যে নিম্নলিখিত রয়েছে :

export const ROUTER_DIRECTIVES = [RouterOutlet, RouterLink, RouterLinkWithHref, 
  RouterLinkActive];

- directivesঅ্যারেতে, তারপরে যখন কৌণিক বিশ্লেষণ করে

<a [routerLink]="['RoutingTest']">Routing Test</a>

এটি সম্পর্কে জানে না RouterLink নির্দেশ (যা ব্যবহার অ্যাট্রিবিউট নির্বাচক routerLink)। যেহেতু কৌণিক কি না জানি না aউপাদান, এটা ধরে নেয় যে [routerLink]="..."একটি হল সম্পত্তি জন্য বাঁধাই aউপাদান। কিন্তু এটি তখন আবিষ্কার করে যে উপাদানগুলির routerLinkএকটি নেটিভ সম্পত্তি নয় a, তাই এটি অজানা সম্পত্তি সম্পর্কে ব্যতিক্রম ছুঁড়ে ফেলে।


আমি সিনট্যাক্সের অস্পষ্টতাকে সত্যই পছন্দ করি না । অর্থাৎ বিবেচনা করুন

<something [whatIsThis]="..." ...>

শুধু এইচটিএমএল দিকে তাকিয়ে আমরা যদি বলতে পারে না whatIsThisহয়

  • একটি নেটিভ সম্পত্তি something
  • একটি নির্দেশকের বৈশিষ্ট্য নির্বাচনকারী
  • এর একটি ইনপুট সম্পত্তি something

directives: [...]এইচটিএমএলকে মানসিকভাবে ব্যাখ্যা করতে আমাদের কোনটি উপাদান / নির্দেশকের মেটাডেটাতে নির্দিষ্ট করা আছে তা জানতে হবে । এবং যখন আমরা directivesঅ্যারেতে কিছু রাখা ভুলে যাই, তখন আমার মনে হয় এই অস্পষ্টতাটি ডিবাগ করা কিছুটা শক্ত করে তোলে।


7

আপনি আপনার মডিউল আছে

import {Routes, RouterModule} from '@angular/router';

আপনাকে মডিউলটি রুটমোডুল রফতানি করতে হবে

উদাহরণ:

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})

যারা এই মডিউলটি আমদানি করেন তাদের জন্য কার্যকারিতা অ্যাক্সেস করতে সক্ষম হবেন।


5

আমি উপরে উল্লিখিত সমস্ত পদ্ধতি চেষ্টা করেছি B তবে কোনও পদ্ধতিই আমার পক্ষে কাজ করে না in শেষ পর্যন্ত আমি উপরের সমস্যার সমাধান পেয়েছি এবং এটি আমার পক্ষে কাজ করছে।

আমি এই পদ্ধতিটি চেষ্টা করেছি:

এইচটিএমএলে:

<li><a (click)= "aboutPageLoad()"  routerLinkActive="active">About</a></li>

টিএস ফাইলে:

aboutPageLoad() {
    this.router.navigate(['/about']);
}

4

আমার ক্ষেত্রে আমি অ্যাপ মডিউলে রাউটারমডুল আমদানি করেছি তবে আমার বৈশিষ্ট্য মডিউলে আমদানি করা হয়নি। আমার ইভেন্টমোডুলে রাউটার মডিউলটি আমদানির পরে ত্রুটিটি চলে যায়।

import {NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import {EventListComponent} from './EventList.Component';
import {EventThumbnailComponent} from './EventThumbnail.Component';
import { EventService } from './shared/Event.Service'
import {ToastrService} from '../shared/toastr.service';
import {EventDetailsComponent} from './event-details/event.details.component';
import { RouterModule } from "@angular/router";
@NgModule({
  imports:[BrowserModule,RouterModule],
  declarations:[EventThumbnailComponent,EventListComponent,EventDetailsComponent],
  exports: [EventThumbnailComponent,EventListComponent,EventDetailsComponent],
   providers: [EventService,ToastrService]
})
export class EventModule {

 }

3

ইউনিট পরীক্ষার সময় যদি এই ত্রুটিটি পেয়ে থাকে তবে দয়া করে এটি লিখুন।

import { RouterTestingModule } from '@angular/router/testing';
beforeEach(async(() => {
  TestBed.configureTestingModule({
   imports: [RouterTestingModule],
   declarations: [AppComponent],
 });
}));

0

কেবলমাত্র একটি পরীক্ষার ফাইলটিতে যখন এই সমস্যাটি হয় তখন আমি @ রায়ক্রোর জবাবটিকে সত্যই প্রশংসা করি! সেখানেই আমি এর মুখোমুখি হয়েছিলাম।

ব্যাকআপ হিসাবে কিছু করার অন্য উপায় থাকা প্রায়শই সহায়ক হিসাবে, আমি এই কৌশলটিও উল্লেখ করতে চেয়েছিলাম যা কাজ করে (আমদানির পরিবর্তে) RouterTestingModule ):

import { MockComponent } from 'ng2-mock-component';
. . .
TestBed.configureTestingModule({
  declarations: [
    MockComponent({
      selector: 'a',
      inputs: [ 'routerLink', 'routerLinkActiveOptions' ]
    }),
    . . .
  ]

(সাধারণত, একটি routerLinkএকটি ব্যবহার করা হবে<a> উপাদান তবে অন্যান্য উপাদানগুলির জন্য সে অনুযায়ী নির্বাচককে সামঞ্জস্য করে))

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

Error: Template parse errors:
    More than one component matched on this element.
    Make sure that only one component's selector can match a given element.
    Conflicting components: ButtonComponent,Mock

আমি কীভাবে এই উপহাস এবং আমার ButtonComponentএকই নির্বাচকটি ব্যবহার করছিলাম তা আমি বেশ বুঝতে পারি না , সুতরাং বিকল্প পদ্ধতির সন্ধানের ফলে আমাকে এখানে @ রায়ক্রোর সমাধানের দিকে নিয়ে যায়।


0

আপনি যদি ভাগ করা মডিউল ব্যবহার করেন, কেবলমাত্র আপনার উপাদানটি ঘোষিত মডিউলটিতে রাউটারমডুল যুক্ত করুন এবং যুক্ত করতে ভুলবেন না <router-outlet></router-outlet>

এখান থেকে রেফারেন্স করা রাউটারলিঙ্ক কাজ করে না


-4

আমার সমাধান সহজ। আমি [রাউটারলিঙ্ক] এর পরিবর্তে [href] ব্যবহার করছি। আমি [রাউটারলিঙ্ক] এর জন্য সমস্ত সমাধান চেষ্টা করেছি। তাদের কেউই আমার ক্ষেত্রে কাজ করে না।

এখানে আমার সমাধান:

<a [href]="getPlanUrl()" target="_blank">My Plan Name</a>

তারপরে getPlanUrlটিএস ফাইলে ফাংশনটি লিখুন ।

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