こんにちは私は子供が親の名前にアクセスする必要があるangularjsで単純なコンポーネントを表示しようとしています。そして私のコードは次のようになります:
HTMLファイル:
<html>
<head>
<script type='text/javascript' src='angular.min-1.5.0.js'></script>
<script type='text/javascript' src='app.js'></script>
</head>
<body ng-app="componentApp">
<div ng-controller="helloCnt">
<hello name="Parent"></hello>
<hello1 name="Child"></hello1>
<label>List: <input name="namesInput" ng-model="names" ng-list=" | " required></label>
</div>
</body>
</html>
コード:
app.component('hello', {
transclude: true,
template:'<p>Hello I am {{$ctrl.name}} and ctrl name is {{myName}}</p>',
bindings: { name: '@' },
controller: function($scope) {
$scope.myName = 'Alain';
alert(1);
}
});
app.component('hello1', {
require: {
parent: 'hello'
},
template:'<p>Hello I am {{$ctrl.name}} && my parent is {{myNameFromParent}} </p>',
bindings: { name: '@' },
controller: function($scope) {
$scope.myNameFromParent=this.parent.myName;
alert(2);
}
});
そして、それはエラーをスローします:
TypeError: Cannot read property 'myName' of undefined
コードの何が間違っているのか、なぜ親が見つからないのかを理解できません。私が犯している間違いに関するすべての入力。見逃した小さなもののようです。
Requireで継承するには、コンポーネントをネストする必要があります:
<hello name="Parent"></hello>
<hello1 name="Child"></hello1>
代わりに
<hello name="Parent">
<hello1 name="Child"></hello1>
</hello>
次に、次のように親を要求できます。
require: {
parent: '^^hello'
},
実際には、@ gycをポイントした回答を使用して次の変更を行った後、回答が得られました。
JSコード:
angular
.module('componentApp', [])
.controller('helloCtrl', function ($scope) {
$scope.names = ['morpheus', 'neo', 'trinity'];
})
.component('hello', {
transclude: true,
template: '<p>Hello I am {{parentCtrl.name}} and my name is {{parentCtrl.myName}}</p><ng-transclude></ng-transclude>',
controllerAs: 'parentCtrl',
controller: function ($scope) {
this.myName = 'Braid';
},
bindings: {
name: '@'
}
})
.component('hello1', {
template: '<p>Hello I am {{$ctrl.name}} && my parent is {{myNameFromParent}} </p>',
controller: function ($scope) {
this.$onInit = function () {
$scope.myNameFromParent = this.parent.myName;
};
},
bindings: {
name: '@'
},
require: {
parent: '^hello'
}
});
HTML:
<html>
<body ng-app="componentApp">
<div ng-controller="helloCtrl">
<hello name="Parent">
<hello1 name="Child"></hello1>
</hello>
<label>List:
<input name="namesInput" ng-model="names" ng-list=" | " required>
</label>
</div>
</body>
</html>
私が行っていたよくある間違いは、ネストされたコンポーネントのフォーマットに従っておらず、親でトランスクルードを使用していなかったことです。残りの部分は、これらの2つの変更を行い、その後のコードを変更したときに問題なく動作しました。
PS-HTMLに含まれるng-listはコンポーネントとは関係ありません。それは他の目的のためでした。
@gyc-助けてくれてありがとう。入力は役に立ちました。
@ daan.desmedt-ディレクティブではなくコンポーネントの解決策を期待していました。