2015-11-21 9 views
16

私はアプリは「ディレクティブ」を作るために、角1.5.0-beta.2角1.5コンポーネントメソッドtemplateUrl +機能

で作業を取得しようとしている私は、次のコードを持っている:

myApp.component('gridshow', { 
    bindings: { 
    slides: '=' 
    }, 
    controller: function() { 

    }, 
    controllerAs: 'grid', 
    template: function ($element, $attrs) { 
    // access to $element and $attrs 
    return [ 
     '<div class="slidegrid">', 
     '<div ng-repeat="slide in grid.slides">', 
     '{{slide.image}}', 
     '</div>', 
     '</div>' 
    ].join('') 
    } 
}); 

$element$attrsにアクセスできる関数を返すテンプレートのアイデアは気に入っていますが、これをtemplateUrlとどのように組み合わせるのですか?

+3

は、1つまたは別のものを使用しますか。 – dfsq

+0

私は驚いていませんが、少し不満です。ありがとうdfsq。 – tuvokki

+1

なぜdisapointed。テンプレートとテンプレートURLの両方で何をしたいですか?それはエレベーター内の階段を求めているような...彼らは排他的だ... –

答えて

19

1.5.0-beta2 templateUrlは、インジェクタによって呼び出される関数とすることができます。 $element$attrsare injectedboth template and templateUrl functionscomponentとの間の他の依存性も含む。

これは

... 
    templateUrl: function ($element, $attrs) { 
    // access to $element and $attrs 
    ... 
    return $attrs.uninterpolatedTemplateUrl; 
    } 

が代わりに行うことができることを意味します。

+1

これはどうやって外部テンプレートを使っていますか? templateUrlは通常、テンプレートへの参照を保持します。 – tuvokki

+0

そうです。従って、テンプレートURLに基​​づいて決定することができる。要素の属性。あなたはそれを使う予定でしたか? templateUrl関数でテンプレートレスポンスを取得する予定がある場合は、no、まだディレクティブの後のテンプレートを処理する必要があります(コンポーネントにはリンク機能はありませんが、コントローラがあります)。 – estus

+0

私はエスタスを理解しています。私はここで本当の目的を持っていませんでした。ただ疑問に思う。 – tuvokki

3

@estus解決策が私のスクリプトを偽装するまで私のために働いた。私のために働いたソリューションです

Error: [$injector:unpr] Unknown provider: eProvider <- e 

:Uglifiedそれは次のようなエラーを与えた

['$element', '$attrs', function($element, $attrs) { 
    return $attrs.uninterpolatedTemplateUrl; 
}] 
+3

** DIを使用するAngularの**すべての関数には、適切に縮小されるよう注釈を付ける必要があります。私。 ( 'link'、' template'など)を除いて、Angular APIのほぼすべての機能です。これは、デフォルトのアクションであるため、例では省略されることがよくあります。 – estus

6

私は技術に従うことによって、この問題を解決しました。これはあなたを助けるかもしれません。

テンプレート

<div data-ng-repeat="field in $ctrl.fields track by $index"> 
    <render-field data-field-type="{{field.type}}"></render-field> 
</div> 

あなたがそれらを結合していないコンポーネント

/** 
* @ngdoc Component 
* @name app.component.renderField 
* @module app 
* 
* @description 
* A component to render Field by type 
* 
* @author Mohan Singh (gmail::[email protected], skype :: mohan.singh42) 
*/ 
(function() { 
    'use strict'; 

    angular 
    .module('app') 
    .component('renderField', { 
     bindings: { 
     fieldType: '@', 
     }, 
     template: '<div ng-include="$ctrl.templateUrl">', 
     controller: [ 
     function() { 
      var $ctrl = this; 
      $ctrl.$onInit = initialization; 
      $ctrl.$onDestroy = onDestroy; 
      $ctrl.$onChanges = onChanges; 

      /** 
      * public properties 
      */ 
      /** 
      * public methods 
      */ 
      /** 
      * @function 
      * @name initialization 
      * @description 
      * A component's lifeCycle hook which is called after all the controllers on an element have been constructed and had their bindings initialized 
      */ 
      function initialization() { 
      } 

      /** 
      * @function 
      * @name onChanges 
      * @description 
      * A component's lifeCycle hook which is called when bindings are updated. 
      */ 
      function onChanges(bindings) { 
      if(bindings.fieldType && bindings.fieldType.isFirstChange()){ 
       //$ctrl.fieldType['text' | 'textarea' | 'select' | 'radio'] 
       $ctrl.templateUrl = 'partials/fields/'+$ctrl.fieldType+'.html'; 
      } 
      } 
      /** 
      * @function 
      * @name onDestroy 
      * @description 
      * A component's lifeCycle hook which is called when is called on a controller when its containing scope is destroyed. 
      * Usefull to release external resources, watches and event handlers. 
      */ 
      function onDestroy() { } 
     }] 
    }); 
})(); 
+1

メイト、その解決策は素晴らしいです!私は、異なるルートを持つことで解決しました。設定可能な値はHTMLにハードコードされています(スコープはバインドできません)。あなたのソリューションははるかに良いです。私はこれ以上投票することができれば幸いです! –

+0

@DanielMackayはあなたをお待ちしております。 –

関連する問題