2017-07-09 11 views
1

でのバインディングプロパティを必須にすることができます。どのように私は次のコンポーネントがある場合はangularJsコンポーネント

angular.module('myApp').component('myComponent', { 
    templateUrl: 'myComponent.html', 
    bindings: { 
     myPropOne: '<', 
     myPropTwo: '<' 
    } 
}); 

以降のを、私はこのようなmyPropTwoを通過せずにHTMLを経由してコンポーネントをインスタンス化:

<my-component my-prop-one="vm.prop1"></my-component> 

myPropTwoが渡されなかったため、角度に失敗することがありますか?はい、私はのような何かを行うことができます知っている:つまり

angular.module('myApp').component('myComponent', { 
    templateUrl: 'myComponent.html', 
    bindings: { 
     myPropOne: '<', 
     myPropTwo: '<' 
    }, 
    controller: function() { 
     this.$onInit = function() { 
      if(this.myPropTwo === undefined) { 
       throw new Error('myPropTwo must be passed'); 
      } 
     } 
    } 
}); 

は、私は手動でそれを行うことなく、必須myPropTwoを作ることができます。これを行うネイティブな方法はありますか?

編集:

@FrankModicaが正しいことのように思えます。それはあまりにも悪いです:(...ここでうまくいけば@FrankModicaの答えに基づいて、いくつかの理解を与えることをjsFiddleの例である: https://jsfiddle.net/cafesanu/5L19t3jx/2/

答えて

1

手動でそれをやってなくて、あなたが必要なものを達成する方法はないようです

コンポーネントバインディングは技術的に自動的に「必須」です。疑問符を追加した場合はオプションですが、片方向バインディングの場合、これはあまり意味がありません。それを供給すれば、そのプロパティは単にコンポーネントのコントローラ上には存在しませんが、バインディングが必要であり、それを供給しない場合、そのプロパティはコンポーネントのコントローラのundefinedとなります。

例えば、myPropOneがオプションで、それを指定しないと、コントローラオブジェクトを記録するときには表示されません。

bindings: { 
    myPropOne: '<?', // optional 
    myPropTwo: '<' // required 
} 

controller: function() { 
    this.$onInit = function() { 
     console.log(this); 

     // myPropTwo: "prop2" 

     console.log(this.myPropOne === undefined); 
     console.log(this.hasOwnProperty('myPropOne')); 

     // true 
     // false 
    } 
} 

しかしmyPropOneが必要とされていて、それを指定しない場合、プロパティには、コントローラに実際にあるが、それはundefinedです:あなたが唯一の"prop2"としてmyPropTwoを指定した場合、それはあなたが表示されますすべてです。

bindings: { 
    myPropOne: '<', // required 
    myPropTwo: '<' // required 
} 

controller: function() { 
    this.$onInit = function() { 
     console.log(this); 

     // myPropOne : undefined 
     // myPropTwo: "prop2" 

     console.log(this.myPropOne === undefined); 
     console.log(this.hasOwnProperty('myPropOne')); 

     // true 
     // true 
    } 
} 

差が=バインディングを使用した場合より明白であるように思わ:あなたはコントローラオブジェクトをログインした場合ので、あなたはそれが表示されます。バインディングが必要な場合に、コンポーネントのコントローラーに割り当てようとしたときにエラーが発生します。これはAngularが変更を伝播する方法を知らないので意味があります。

関連する問題