web-dev-qa-db-ja.com

AngularJSのアップグレード(1.5から1.6、1.7)ディレクティブスコープバインディングを未定義にします

私は次のコードを持っています:

angular
  .module('myApp')
  .directive('layout', function () {
      return {
          restrict: 'E',
          template: '<div ng-include="layoutCtrl.pageLayout"></div>',
          controller: 'LayoutController',
          controllerAs: 'layoutCtrl',
          bindToController: true,
          scope: {
              pageLayout: '=',
              pageConfiguration: '=',
              isPreview: '='
          }
      };
  });

angular
  .module('myApp')
  .controller('LayoutController', LayoutController);

function LayoutController($scope, LayoutDTO, LayoutPreviewDTO) {
    var self = this;
    self.layoutDTO = LayoutDTO;
    self.layoutPreviewDTO = LayoutPreviewDTO;
    var test = $scope;

    if(self.isPreview)
        self.layoutModel = new self.layoutPreviewDTO(self.pageConfiguration);
    else
        self.layoutModel = new self.layoutDTO(self.pageConfiguration);
}


<div>
    <layout page-layout="ctrl.layoutTemplateUrl" page-configuration="ctrl.pageConfiguration" is-preview="false"></layout>
</div>

angular 1.5.3バージョンではこれは期待通りに機能しましたが、コントローラーの変数には値が入っていました。1.6.xにアップグレードして以来、self.pageConfigurationは未定義になりました。

angularバージョン以外は何も変更されていません。

コントローラーのディレクティブに渡される値のハンドルを取得するにはどうすればよいですか?

10
drabbitharv

AngularJSチームは、スコープバインディングに依存するコントローラーコードを_$onInit_関数に移動することをお勧めします。

_function LayoutController($scope, LayoutDTO, LayoutPreviewDTO) {
    var self = this;
    this.$onInit = function () {
        // bindings will always be available here
        // regardless of the value of `preAssignBindingsEnabled`.
        self.layoutDTO = LayoutDTO;
        self.layoutPreviewDTO = LayoutPreviewDTO;
        var test = $scope;

        if(self.isPreview)
            self.layoutModel = new self.layoutPreviewDTO(self.pageConfiguration);
        else
            self.layoutModel = new self.layoutDTO(self.pageConfiguration);
    };
}
_

$ compile:

bcd0d4 により、コントローラーインスタンスへの事前割り当てバインディングはデフォルトで無効になっています。再び有効にすることは可能ですが、これは移行中に役立ちます。事前割り当てバインディングは非推奨であり、将来のバージョンで削除されるため、できるだけ早くそれに依存しないようにアプリケーションを移行することを強くお勧めします。

存在するバインディングに依存する初期化ロジックは、常に呼び出されることが保証されているコントローラの$onInit()メソッドに配置する必要がありますafterバインディングが割り当てられています。

-AngularJS開発者ガイド-v1.5からv1.6への移行-$ compile


更新

_$compileProvider.preAssignBindingsEnabled_フラグは、AngularJS V1.7から削除されました。

AngularJSチームは、できるだけ早くアプリケーションに移行しないことを強くお勧めします。AngularJS V1.6は、2018年7月1日にサポートを終了します。

ドキュメントから:

8f8c9 により、コンストラクタでディレクティブバインディングを使用できなくなりました。

以前は、_$compileProvider.preAssignBindingsEnabled_フラグがサポートされていました。フラグは、バインディングがコントローラーコンストラクター内で使用可能か、_$onInit_フックのみで使用可能かを制御しました。バインディングはコンストラクターで使用できなくなりました。

コードを移行するには:

  • $compileProvider.preAssignBindingsEnabled(true)を指定した場合、まずフラグをfalseに反転できるようにコードを移行する必要があります。その方法の手順は、 「1.5から1.6への移行」ガイド に記載されています。その後、$compileProvider.preAssignBindingsEnabled(true)ステートメントを削除します。

— AngularJS開発者ガイド-V1.7への移行-コンパイル

注意:

2018年7月1日に、AngularJS 1.6のサポートは終了します。詳細については、「 AngularJS MISC-バージョンサポートステータス 」を参照してください。

15
georgeawg

私はそれを考え出した:

https://github.com/angular/angular.js/commit/dfb8cf6402678206132e5bc603764d21e0f986ef

これはデフォルトでfalseになりました。trueに設定する必要があります$ compileProvider.preAssignBindingsEnabled(true);

1
drabbitharv