私は次のコードを持っています:
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バージョン以外は何も変更されていません。
コントローラーのディレクティブに渡される値のハンドルを取得するにはどうすればよいですか?
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バインディングが割り当てられています。
_$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)
ステートメントを削除します。
2018年7月1日に、AngularJS 1.6のサポートは終了します。詳細については、「 AngularJS MISC-バージョンサポートステータス 」を参照してください。
私はそれを考え出した:
https://github.com/angular/angular.js/commit/dfb8cf6402678206132e5bc603764d21e0f986ef
これはデフォルトでfalseになりました。trueに設定する必要があります$ compileProvider.preAssignBindingsEnabled(true);