だから私は既存のRailsアプリケーション用のAngularフロントエンドを書いています。$ qを使用することは、バックエンドを変換してREST ApiをJSONを介してngResourceに直接提供する前の中間ステップであることを理解していますが、残念ながら、さまざまなRubyの場所にあるロジックが多すぎて、すべてを簡単に書き換えることができません。純粋にAngular形式。
問題は、返されたパーシャルのng属性を正しくインスタンス化して処理するにはどうすればよいかということです。以下は、コードのサニタイズされたバージョンです。
Company.Controller.TypeAccordionController = (scope, http, element, q, typeJQueryService) ->
scope.validateForm = (event) ->
console.log "we are here"
scope.getTheDamnType = (id) ->
typeJQueryService.multipart(id).then (response)->
angular.element('.datePicker').datepicker()
Company.Controller.TypeAccordionController.$inject = ['$scope', '$http', '$element', '$q','typeJQuery']
返されたHAMLはページに正しく表示されており、datepickerは正常にインスタンス化されています。返されたHAMLの最初の行は次のとおりです。
= form_for @type, :html=>{:class=>'form-horizontal type-form', :"ng-submit"=>"validateForm($event);"} do |f|
興味深い補足:HAML内の生のDOM要素にng属性を配置することは魅力のように機能します。例:
= form_for @type, :html=>{:class=>'form-horizontal type-form', :"ng-controller"=>"someFormController"} do |f|
上記は機能しません。ただし、以下は魅力のように機能します。
= form_for @type, :html=>{:class=>'form-horizontal type-form', :"ng-controller"=>"someFormController"} do |f|
%div(ng-controller=someFormController)
表示を行うサービスは次のように機能します。
Company.MyModule.factory 'TypeJQuery', ($q, $rootScope) ->
multipart: (element) ->
deferred = $q.defer()
$.get "..." + element, (data) ->
$rootScope.$apply ->
deferred.resolve data
deferred.promise
ただし、送信時には何も起こらず、ログは印刷されません。別の試みは次のとおりです。
scope.validateForm = (event) ->
console.log "we are here"
scope.getTheDamnType = (id) ->
typeJQueryService.multipart(id).then (response)->
angular.element('.datePicker').datepicker()
angular.element('form').attr("ng-submit", "validateForm($(this).attr('id'))")
同様に、有用なことは何も起こりませんでした。
これを修正する方法について何か提案はありますか?ちなみに、後で返されるパーシャルには、ng-controllerが付いた別の要素があります。言うまでもなく、役に立つことは起こりません。
編集:HAMLは実際には生で返されるのではなく、次のjs.erbを介してルーティングされます。
$('div.form_<%= @artifact.id %>').replaceWith("<%=j render 'form' %>");
次に、フォームの部分を返します。