2016-04-27 11 views
9

Ist es möglich, eine Funktion an eine Komponente zu übergeben und diese Funktion in der Komponente aufzurufen, die einen Parameter übergibt?Angular 1.5 Component: Übergeben einer Funktion

Beispiel:

Liste der Beiträge

<post-list posts="blog.posts" 
      loading="blog.loadingPosts" 
      get-post-url="blog.getPostUrl" 
      is-user-authenticate="blog.user"> 
</post-list> 

getPostUrl ist eine Funktion (innerhalb des Behälters Controller):

const getPostUrl = (postId) => { 
    const protocol = $location.protocol(); 
    const host = $location.host(); 
    const port = $location.port(); 

    return protocol + "://" + host + "" + (port !== 80 ? ":" + port : "") + "/blog/post/" + postId; 
}; 

Liste der Beiträge: Komponente

const PostList = { 
    "bindings": { 
    "posts": "<", 
    "loading": "<", 
    "getPostUrl": "&", //Function getPostUrl 
    "isUserAuthenticate": "<" 
    }, 
    "template": `<div> 
       <div class="col-md-9 text-center" data-ng-if="$ctrl.loading"> 
        <i class="fa fa-spinner fa-spin fa-2x"></i> 
       </div> 

       <div class="col-md-9 posts" data-ng-if="!$ctrl.loading"> 
        <div data-ng-repeat="post in $ctrl.posts"> 
        <post creation-date="{{post.creationDate}}" 
          content="{{post.content}}" 
          post-url="{{$ctrl.getPostUrl(post.creationDate)}}" 
          is-user-authenticate="$ctrl.user"> 
        </post> 
        </div> 
       </div> 
       </div>`, 
    "transclude": false 
}; 

angular 
    .module("blog") 
    .component("postList", PostList); 

In dieser Zeile:

post-url="{{$ctrl.getPostUrl(post.creationDate)}}" Ich möchte die Funktion aufzurufen, einen Parameter übergeben und diese Funktion eine Zeichenfolge zurückkehrt.

In Pfostenkomponente (nicht PostList) die PostURL ein Zeichenfolgenattribut @ ist.

Aber ... funktioniert nicht!

angular.js:13550 Error: [$interpolate:interr] Can't interpolate: {{$ctrl.getPostUrl(post.creationDate)}} TypeError: Cannot use 'in' operator to search for 'blog' in 1459329888892 Error Link

Ist es möglich, es zu tun? Und wie?

Vielen Dank!

+0

Sie brauchen nicht die '{{}}' für eine '&' Bindung - siehe in diesem Abschnitt der Dokumentation für ein gutes Beispiel dafür, wie zu erreichen, was Sie suchen zu tun: https://docs.angularjs.org/guide/component#component-based-application-architecture –

+0

Aber die Rückkehr dieser Funktion ist ein String ... 'post-url' ist ein String. Ich möchte die Funktion aufrufen, die diese Zeichenfolge zurückgibt –

+0

Ich habe jetzt geändert ... Aber jetzt erscheint dieser Fehler: 'Kann 'in' Operator nicht verwenden, um nach 'Blog' zu suchen' –

Antwort

5

Wenn Sie die Funktion aus dem Inneren einer Komponente anrufen möchten, und haben sie einen Wert zurückgeben, dann müssen Sie Zweiweg-Bindung:

"bindings": { 
    "posts": "<", 
    "loading": "<", 
    "getPostUrl": "=", // <-- two-way binding 
    "isUserAuthenticate": "<" 
}, 

Dies ist jedoch wahrscheinlich nicht sehr gute Idee. Ziehen Sie in Betracht, um Daten an die Komponente weiterzuleiten, anstatt Komponentenanforderungsdaten von außerhalb zu erstellen. Dies wird eine viel bessere isolierte Komponente ergeben.

+0

Danke, jetzt funktioniert! –

9

Sie können Funktionen an Komponenten übergeben, aber Sie müssen die Funktionsargumente als Objekt mit den richtigen Argumentnamen als Schlüssel definieren. Beispiel:

<post-list posts="blog.posts" 
      loading="blog.loadingPosts" 
      get-post-url="blog.getPostUrl(postId)" 
      is-user-authenticate="blog.user"> 
</post-list> 

const PostList = { 
"bindings": { 
    "posts": "<", 
    "loading": "<", 
    "getPostUrl": "&", //Function getPostUrl 
    "isUserAuthenticate": "<" 
}, 
"template": `<post creation-date="{{post.creationDate}}" 
         content="{{post.content}}" 
         post-url="{{$ctrl.getPostUrl({postId:post.creationDate})}}"> 
       </post> 
+0

genial, danke – 1Canuck16

+2

sollte dies wirklich die akzeptierte Lösung sein, da es die richtige Funktion verbindlich ist. Danke für den Tipp. Ich wusste nicht, dass die innere Komponente als ein benanntes Objekt den Param zurückgeben musste. – gilm0079

Verwandte Themen