控制器变量未在html

时间:2016-05-18 14:26:01

标签: javascript angularjs socket.io

我正在尝试从数据库中提取的数据中创建一个选择下拉列表,以便选择我的html所在的某个日期:

<div>
        <div>Select Year</div>
        <select class="browser-default" data-ng-model="year">
          <option ng-repeat="year in years">{{year}}</option>
        </select>
        <div>Select Month</div>
        <select  class="browser-default" data-ng-model="month"  ng-options="month.id as month.name for month in months" ></select>
        <a class="btn waves-effect waves-light blue darken-1 right bout2" ng-click="changeDate(month, year)">Confirm</a>
      </div>

并在我的控制器中:

socket.emit('Question', {
       // SQL to get the years from database
    });
socket.on('response', function (data){

            $scope.years =data.rep;
            $scope.year = "2016";
});
$scope.list_months = {"months":[{"id":"01","name":"Janvier"},{"id":"02","name":"Fevrier"},{"id":"03","name":"Mars"},{"id":"04","name":"Avril"},{"id":"05","name":"Mai"},{"id":"06","name":"Juin"},{"id":"07","name":"Juillet"},{"id":"08","name":"Aout"},{"id":"09","name":"Septembre"},{"id":"10","name":"Octobre"},{"id":"11","name":"Novembre"},{"id":"12","name":"Decembre"}]};
    $scope.months = $scope.list_months.months;

月份的输出工作完美,并且通过将值限制为$ scope.month也可以轻松初始化,但是这是多年来的另一个故事,当我刷新应用程序有时列表出现,有时候它没有t(下拉列表为空)。 因为它看起来正确,这意味着问题不在SQL中,但是什么使它消失?能帮我看看我做错了吗?

提前致谢

1 个答案:

答案 0 :(得分:2)

您正在socket.io对象的事件处理程序中设置$scope.years。这是从Angular之外的外部源触发的,这意味着它不知道更改,因此不会运行$digest()来更新页面。

设置yearsyear属性后,您需要手动调用$scope.$apply()

socket.on('response', function (data){
    $scope.years = data.rep;
    $scope.year = "2016";
    $scope.$apply();
});

它可能偶尔似乎有效,因为页面上的其他操作导致Angular运行$digest(),并且年份下拉列表会重新呈现为副作用。