【发布时间】:2012-11-03 13:40:01
【问题描述】:
所以我正在为一个预先存在的 Rails 应用程序编写一个 Angular 前端。我知道在将后端转换为通过 JSON 将 REST Api 直接提供给 ngResource 之前,使用 $q 充其量只是一个中间步骤,但不幸的是,目前在各种 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 正在页面上正确显示,并且日期选择器正在成功实例化。返回的 HAML 的第一行是:
= form_for @type, :html=>{:class=>'form-horizontal type-form', :"ng-submit"=>"validateForm($event);"} do |f|
有趣的旁注:将 ng-attributes 放在 HAML 中的原始 DOM 元素上就像一个魅力。示例:
= 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' %>");
然后返回表单部分。
【问题讨论】:
-
我知道它不是很有帮助,但它看起来不太适合 AngularJS,如果您需要在控制器中操作 DOM,那么无论如何使用 Angular 不会有很多好处。如果你继续使用 angular:你不需要使用 jQuery ajax,你可以使用 $http 服务
-
我知道这一点,这是长期目标,这应该是一种中间步骤,这样我们就不必一次性重写整个现有的 Rails 应用程序。不过还是谢谢。
标签: jquery ajax coffeescript haml angularjs