AngularJS没有收听我所有的字段

时间:2012-10-23 05:27:56

标签: ruby-on-rails ruby-on-rails-3 angularjs

我正在使用带有Rails的AngularJS并创建未在AngularJS范围内注册的动态嵌套表单项。他们被分配了'ng-dirty'类。

我有一个有三个房子的投资者,在我的Angular控制器中我只分配前两个,因为我真的想通过Rails设置这些。

$ (event) ->
  app = angular.module "investor", []

  app.controller("InvestorCtrl", ["$scope", ($scope) ->
    $scope.houses = [
      { cost: "295000", value: "450000" },
      { cost: "600000", value: "620000"  }    
    ]
    $scope.calc_totals = ->
      # Initialise variables
      cost = 0
      value = 0

      # Go through each house and calculate the total cost
      for h in $scope.houses
        cost = parseInt(cost) + parseInt(h.cost)
        value = parseInt(value) + parseInt(h.value)

      # Set the total
      $scope.total_cost = cost
      $scope.total_value = value  

    # Run the calculation at the start  
    # $scope.calc_totals()
  ])

  angular.bootstrap document, ['investor']

这是我的表格

%div{"ng-controller" => "InvestorCtrl"}
    = form_for(@investor) do |f|
        - if @investor.errors.any?
            #error_explanation
                %h2
                    = pluralize(@investor.errors.count, "error")
                    prohibited this investor from being saved:
                %ul
                    - @investor.errors.full_messages.each do |msg|
                        %li= msg
        .field
            = f.label :name
            = f.text_field :name, "ng-model" => "name"

        - i = 0
        = f.fields_for :houses do |builder|
            .field
                = render :partial => "house", :locals => {:f => builder, :i => i}
                - i = i + 1

        .field
            = f.label :total_cost
            = f.number_field :total_cost, "ng-model" => "total_cost"
        .field
            = f.label :total_value
            = f.number_field :total_value, "ng-model" => "total_value"
        .actions
            = f.submit

如果我键入第一个或第二个房子'cost'或'value',那么它会更新total_cost,但如果我更新第三个房子,它将不会更新total_cost。

有没有办法动态告诉angularjs监听这些元素而不在控制器中分配它们?

1 个答案:

答案 0 :(得分:0)

你真的对此有点不对,IMO。由于Angular可以(并且将会)为您处理重复HTML的呈现,因此您不一定需要在服务器上进行HTML呈现。您在服务器上所需要的只是一些JSON。如果您想要立即渲染它,您只需确保在初始化控制器时正确设置初始值。

将$ http或自定义服务注入您的控制器,并以JSON格式直接从服务器提取您想要的数据,然后将其插入您的范围。如果您的HTML和指令设置正确,它将只渲染。从那里,所有其他逻辑将是相同的。

网络向前发展。而且,通过前进,我的意思是你曾经在服务器上做的所有HTML渲染实际上开始越来越多地在客户端上完成。您曾经用于在Web服务器上获取数据的服务层?那么现在是你的网络服务器。

我知道这不是你问题的直接答案,但它会大大简化你想要做的事情。否则你有一个平衡的行为,会很快发疯。