web-dev-qa-db-ja.com

angularjs 1.5で親コンポーネントにアクセスする方法

こんにちは私は子供が親の名前にアクセスする必要がある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

コードの何が間違っているのか、なぜ親が見つからないのかを理解できません。私が犯している間違いに関するすべての入力。見逃した小さなもののようです。

10
Ambar Bhatnagar

Requireで継承するには、コンポーネントをネストする必要があります:

<hello name="Parent"></hello>
<hello1 name="Child"></hello1>

代わりに

<hello name="Parent">
    <hello1 name="Child"></hello1>
</hello>

次に、次のように親を要求できます。

require: {
    parent: '^^hello'
  },
4
gyc

実際には、@ 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-ディレクティブではなくコンポーネントの解決策を期待していました。

4
Ambar Bhatnagar