2017-01-30 11 views
1

私はAngularJS指令を理解しようとしています。私は何かしようとしているものの例として、次のJSFiddleを持っています。 https://jsfiddle.net/7smor9o4/AngularJS指令へのコントローラのバインド

この例でわかるように、vm.alsoId変数はvm.theIdと等しいと予想されます。テンプレートvm.theIdには正しい値が表示されますが、vm.alsoIdは表示されません。

私は間違っていますか?どのように私は私の目標を達成することができます。

それは、最終的なアイデアは、次のような何かを実行することであるのに役立ちます場合:

function directive(service) { 
    var vm = this; 
    vm.entity = null; 

    init(); 

    function init() { 
    service.getEntity(vm.theId).then(function (entity) { 
     vm.entity = entity; 
    }); 
    } 
} 
+0

vm.alsoIdにvm.theIdが割り当てられるまでにvm.theIdは初期化されません。これはここで実証されています:https://jsfiddle.net/84d6e0b4/ – Jukebox

答えて

2

あなたが気づいてきたように、bindToControllerバインディングは(ある$scopeとは異なり、)コントローラのコンストラクタ関数ですぐに利用できません。あなたが探しているのは、角1.5で導入された機能です:ライフサイクルフック、特に$onInitです。

あなたは正しい考えを持っていました。

vm.$onInit = function() { 
    service.getEntity(vm.theId).then(function (entity) { 
     vm.entity = entity; 
    }); 
}; 

そしてhere is your updated fiddleを次のように単にあなたのinit関数定義と呼び出しを交換してください。 (また、この解決方法を使用しないと、watchが必要になります)

1

角度を使用すると、コントローラをバインドすることをお勧めします「あなたは他のディレクティブにAPIを公開する場合にのみ、それ以外の場合はリンクを使用しています。。」

ここでは、リンク機能を使用してfiddleの作業です。

angular.module('app', []) 
    .directive('directive', directive); 

angular.element(function() { 
    angular.bootstrap(document, ['app']); 
}); 

function directive() { 
    return { 
    restrict: 'E', 
    scope: { 
     theId: '<' 
    }, 
    template: ` 
     alsoId: <span ng-bind="alsoId"></span> 
     theId: <span ng-bind="theId"></span>`, 
    link: link 
    }; 
} 
function link(scope, element, attrs) { 

    init(); 

    function init() { 
    scope.alsoId = scope.theId; 
    } 
} 
+1

Angularはそれほどお勧めしません(フレームワークであり、結局は独自の意見を持っていません)。この引用はどこから来たのですか? Angular 1.5に置き換えられたのは、時代遅れの視点です。およびbindToControllerオブジェクトです。これは、Angular 2の移行を容易にするマイルストーンです。 – estus

+0

引用文は私が角書を直接引用していたことを示しています([Angular Docs](https://docs.angularjs.org/guide/directive)参照)。ベストプラクティス:APIを他のディレクティブに公開する場合はコントローラを使用し、それ以外の場合はリンクを使用してください。太字で強調表示されています。 – Ynot

+0

私はそれが時代遅れの観点であり、角度2の移行はこの問題には関係しないと考えています。 – Ynot

関連する問題