Angular(1.2)およびLaravel(4.2))に単純なcrudアプリケーションがあります。単純なcrud操作には、効率的なEloquentメソッドを使用します。
$product->fill(Input::all());
これはリクエストペイロードからすべてのフィールドを取得しますが、空のフィールドでモデルを更新する必要がある場合に問題があります。
編集アクションには、サービスの$ resourcegetメソッドの応答が入力されたフォームがあります。
adminModule.factory 'Product', ($resource) ->
$resource '/admin/products/:id', { id: '@id' }, {
query: { method: 'GET', isArray: false }
update: { method: 'PUT' }
}
コントローラー:
adminModule.controller 'ProductFormEditController', ($scope, Product, $stateParams) ->
$scope.formData = Product.get({id: $stateParams.id})
およびhtml:
<input type="text" data-ng-model="formData.name" name="name" class="form-control" id="name"
placeholder="Nazwa" data-server-error required>
このフィールド値をクリアして送信すると、$ scope.formDataの値は未定義に設定され、PUTリクエストに含まれないため、Laravelモデルの塗りつぶしメソッドはとにかくフィールドであり、検証のために空の値を設定しませんが、モデルの元の値を取ります。
問題は次のとおりです。未定義の代わりにngModelから空の文字列を送信するにはどうすればよいですか?
p.s.入力タイプがTextareaの場合、$ resourceは空の ""文字列を送信します:-/なので、混乱します...
入力に「required」ディレクティブがある場合、空の値が設定されることはありません(したがって、未定義になります)。
入力が空白の場合、モデルに格納する値が取得されないソースコード(ファイルinput.jsの「requiredDirective」)を参照してください。
if (attr.required && ctrl.$isEmpty(value)) {
ctrl.$setValidity('required', false);
return;
} else {
ctrl.$setValidity('required', true);
return value;
}
私見それはとにかく少し奇妙なユースケースです:あなたはクライアント側の検証が必要ですが、それでもサーバーに無効な値を送信したいですよね?
それを行うために、独自の検証( "my-required")を作成できると思います。
または、データをサーバーに送信する前に、たとえばlodash(またはアンダースコア)を使用してデフォルト値をコピーすることもできます。
_.defaults(formData、{name: ""});
allowInvalid
のプロパティngModelOptions
で値が無効な場合でも、モデルを設定するようにangularを構成できます。
allowInvalid
:モデルを未定義に設定するデフォルトの動作の代わりに、正しく検証されなかった値でモデルを設定できることを示すブール値。
例:
<input
type="text"
ng-model="myvalue"
ng-model-options="{ allowInvalid: true }"/>