【问题标题】:Angularjs model change only in view, not in the controllerAngularjs 模型仅在视图中更改,而不在控制器中更改
【发布时间】:2015-04-22 01:28:16
【问题描述】:

可能是一个新手问题。

我有一个问题,我在 HTML 中的数据绑定更新得很好,但 log_interval 函数总是控制台日志“3”。我想使用更新的模型“间隔”以不同的间隔向时间序列数据库发送请求。但是每次我只发送 3 个,即使我的视图正在更新。

我尝试过使用 $scope.$watch(就像在 sn-p 中一样),但它只在页面加载时触发。 我还尝试在所有单选按钮和元素中分别使用 ng-change 和 ng-click。我试图调用 $scope.$watch,但我收到一条错误消息,提示 $digest 已经在运行。没有任何效果:( 如何更新控制器中的模型,以便可以将其用于不同的 HTTP 请求?

.controller('DashCtrl', ['$scope', '$log', function($scope, $log) {

  $scope.interval = 3;

  $scope.$watch("interval", function() {
    $log.log($scope.interval);
  }, true);
  
  $scope.log_interval = function() {
    $log.log($scope.interval);
  };
 
}])

;
<h1>{{interval}}</h1>
<div class="btn-group btn-group-justified">
    <label class="btn btn-default" ng-model="interval" btn-radio="1" uncheckable>1 day</label>
    <label class="btn btn-default" ng-model="interval" btn-radio="2" uncheckable>3 days</label>
    <label class="btn btn-default" ng-model="interval" btn-radio="3" uncheckable>1 week</label>
    <label class="btn btn-default" ng-model="interval" btn-radio="4" uncheckable>2 weeks</label>
    <label class="btn btn-default" ng-model="interval" btn-radio="5" uncheckable>1 month</label>
    <label class="btn btn-default" ng-model="interval" btn-radio="6" uncheckable>3 months</label>
  </div>

【问题讨论】:

  • 我认为您没有建立适当的双向数据绑定。否则,您不希望更新模型以反映视图。它自己发生。而且,我不明白你在 HTML 中想要做什么。

标签: javascript angularjs


【解决方案1】:

您的代码似乎运行良好。

我注意到你似乎在使用 UI-Bootstrap,所以我在他们的 documentation 中分叉了他们的 Plunkr,展示了如何做到这一点。

查看使用您的代码的工作 Plunkr here

HTML:

<h4>Radio &amp; Uncheckable Radio</h4>
<pre>{{interval || 'null'}}</pre>
<div class="btn-group">
  <label class="btn btn-default" ng-model="interval" btn-radio="1" uncheckable>1 day</label>
  <label class="btn btn-default" ng-model="interval" btn-radio="2" uncheckable>3 days</label>
  <label class="btn btn-default" ng-model="interval" btn-radio="3" uncheckable>1 week</label>
  <label class="btn btn-default" ng-model="interval" btn-radio="4" uncheckable>2 weeks</label>
  <label class="btn btn-default" ng-model="interval" btn-radio="5" uncheckable>1 month</label>
  <label class="btn btn-default" ng-model="interval" btn-radio="6" uncheckable>3 months</label>
</div>

控制器:

$scope.interval = 3;

$scope.$watch("interval", function() {
  console.log($scope.interval);
}, true);

需要明确的是,当您选择按钮时,此 $scope.interval 值会自动更新。所以你不必手动更新任何东西(这是使用 Angular 的主要好处之一)。因此,每当您需要执行 HTTP 请求时,只需访问 $scope.interval 值,它将是正确的值。

换句话说:您不需要$scope.$watch,除非您需要在所选按钮更改时执行更复杂的逻辑

【讨论】:

  • 非常感谢您花时间回答!我知道 $watch 在这里应该是不必要的,但它试图强制更新模型,然后从那里运行请求(更改事件)。但由于某种原因,我没有得到 console.log($scope.interval),就像你提供的 plunkr 一样。它完全没有打印出来。好像模型只在 HTML 中改变,而不在控制器中?
  • @user3430863 这可能与您的项目设置有关。看看你能不能把它设置得更像 Plunkr。确保包含正确的 ui-bootstrap javascript 文件,并且正确注入所有内容
  • 您是否使用ng-controller 在HTML 中绑定您的控制器?这是你的全部设置还是围绕这个有更多的 HTML 代码?
  • 谢谢大家!非常高兴您为我的问题付出了这样的努力:) 我想可以使用模型作为参数调用该函数,从而确保它会发生变化。但是我不知道这是否是正确的方法,但它有效! :) &lt;div class="btn-group btn-group-justified" ng-click="request(interval)"&gt;
猜你喜欢
  • 2014-11-28
  • 2014-02-13
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多