次の例 ( plunker ) では、ui-router 状態は、データオブジェクトと、指定された値を使用してこのオブジェクトを新しいオブジェクトに置き換える replaceメソッドを持つアプリコンポーネントにルーティングされます。そのテンプレートには、次のものがあります。
- コールバック バインディング ('&') を介して置換メソッドをトリガーするエディターコンポーネント
- 一方向バインディング ('<') を介してデータオブジェクトを受け取り、$onChanges ライフサイクル フックがトリガーされたときにローカル コピーを作成し、オブジェクトの内容を表示する表示コンポーネント
すべてが正常に動作し、期待どおりです:-)
angular
.module('app', ['ui.router'])
.config(($urlRouterProvider, $stateProvider) => {
$urlRouterProvider.otherwise('/');
$stateProvider
.state('root', {
url: '/',
component: 'app'
});
})
.component('app', {
controller: function () {
this.data = { name: 'initial' };
this.replace = (value) => { this.data = { name: value }; };
},
template: `
<editor on-replace="$ctrl.replace(value)"></editor>
<display data="$ctrl.data"></display>
`
})
.component('editor', {
bindings: {
onReplace: '&'
},
controller: function () {
this.replace = (value) => this.onReplace({value});
},
template: `
<input type="text" ng-model="value">
<button ng-click="$ctrl.replace(value)"> replace object </button>
`
})
.component('display', {
bindings: {
data: '<'
},
controller: function () {
this.$onChanges = (changes) => {
if (changes.data) {
this.data = Object.assign({}, this.data);
}
};
},
template: `
<p> value : {{ $ctrl.data.name }} </p>
`
});
次の 2 番目の例 ( plunker ) に問題があります。appコンポーネントがデータ自体を管理しなくなったことを除いて、まったく同じ設定ですが、ui-router 状態の解決として定義された一方向バインディング ('<') を介してデータオブジェクトを受け取ります (コメントに見られるように、グローバル オブジェクトとメソッドの使用と、サービスを介した対話の両方をテストしました)。この解決されたオブジェクトが再割り当てされると、アプリコンポーネントの $onChanges フックがトリガーされることを期待していました (アプリ コンポーネントのデータ オブジェクトが再割り当てされるときの表示コンポーネントの場合と同様)。しかし、そうではありません。誰か説明がありますか?
let data = { name: 'initial' };
const replace = (value) => { data = { name: value }; };
angular
.module('app', ['ui.router'])
/*.factory('DataService', function () {
let data = { name: 'initial' };
return {
getData: () => data,
replace: (value) => { data = { name: value }; }
};
})*/
.config(($urlRouterProvider, $stateProvider) => {
$urlRouterProvider.otherwise('/');
$stateProvider
.state('root', {
url: '/',
component: 'app',
resolve: {
data: () => data /*(DataService) => DataService.getData()*/
}
});
})
.component('app', {
bindings: {
data: '<'
},
controller: function (/*DataService*/) {
this.$onChanges = (changes) => {
if (changes.data) {
this.data = Object.assign({}, this.data);
}
};
this.replace = (value) => { replace(value); }; /*(value) => { DataService.replace(value); };*/
},
template: `
<editor on-replace="$ctrl.replace(value)"></editor>
<display data="$ctrl.data"></consumer>
`
})
.component('editor', {
bindings: {
onReplace: '&'
},
controller: function () {
this.replace = (value) => this.onReplace({value});
},
template: `
<input type="text" ng-model="value">
<button ng-click="$ctrl.replace(value)"> replace object </button>
`
})
.component('display', {
bindings: {
data: '<'
},
controller: function () {
this.$onChanges = (changes) => {
if (changes.data) {
this.data = Object.assign({}, this.data);
}
};
},
template: `
<p> value : {{ $ctrl.data.name }} </p>
`
});