何らかのプレヴュー画面があって、値を入力すると動的に反映されますが、サブミットしないとDBなどには追加されません。
イメージとしては、ng-repeatで回ってきているproductを引数にとって、そこにpushなんかでreviewを追加する感じですね。それをDB向けに加工するための関数なんかに回すとすっきりしそうです。
フォーム作成時に、novalidateでまずはデフォルトのバリデーション設定を解除しておきます。
また、$validという値を使うと簡単に現在の状態が取得できるので、ボタンの有効化などを設定できます。
<!-- Review Form -->
<!-- $valid is only true when all "required" and formats are valid. -->
<form name="reviewForm" ng-controller="ReviewCtrl"
ng-submit="reviewForm.$valid && addReview(product)" novalidate>
<!-- Live Preview -->
<blockquote >
<strong>{{stars}} Stars</strong>
{{body}}
<cite class="clearfix">{{author}}</cite>
</blockquote>
<!-- Review Form -->
<h4>Submit a Review</h4>
<fieldset>
<select ng-model="stars" ng-options="stars for stars in [5,4,3,2,1]" title="Stars" required>
Rate the Product
</select>
</fieldset>
<fieldset>
<textarea ng-model="body" placeholder="Write a short review of the product..." title="Review"></textarea>
</fieldset>
<fieldset>
<input ng-model="author" type="email" placeholder="example@example.com" title="Email" required />
</fieldset>
<fieldset class="form-group">
<input type="submit" value="Submit Review"/>
</fieldset>
</form>
ちなみに、入力中に値がエラーである場合に背景を赤にしたい、といった場合はCSSに次のように書きます。
invalidだけだと、ページを開いた時から赤くなってしまうためです。
.ng-invalid.ng-dirty{
background-color: red;
}
また、モデル内でURLを指定している画像の読み込み時にも注意が必要です。ng-srcタグを使わないと、読み込みの順序の関係で失敗します。
<img ng-src={{product.image}}/>
0 件のコメント:
コメントを投稿