JQueryMobile选择元素在AngularJs ng-switch指令中不起作用

时间:2013-11-30 11:56:27

标签: angularjs jquery-mobile

我有这个HTML:

<div ng-switch on="MyViewType">
  <div ng-switch-when="B">
    <select id="selectCatagoryFood2" data-role="listview" data-native-menu="true" ng-options="foodCatagory as foodCatagory.Description for foodCatagory in foodCatagories" ng-model="foodCatagory" ng-change="changeFoodCatagory(foodCatagory)">
    </select>
  </div>
</div>

如果选择其他值,则选择显示为空并且不执行任何操作。

示例(第一个“选择”正常,但第二个没有显示选定值):http://plnkr.co/edit/yrXa70?p=preview

问题类似于其他帖子,但此解决方案不起作用(“刷新”启动异常)。

Select Value not Init in AngularJs and JQueryMobile

我认为问题在于这个指令(ng-switch)从DOM中删除并添加了元素,而JQuery Mobile丢失了在元素初始化中创建的一些对象。

1 个答案:

答案 0 :(得分:1)

您示例中的代码:

var unbindWatcher = scope.$watch(attrs.ngModel, function(newValue, oldValue) {
        if (newValue && oldValue === undefined) {
          element.selectmenu('refresh');
          unbindWatcher();
        }
      });

element.selectmenu('refresh');(选择的选项)获得新值并且旧值未定义时,将调用ngModel

这适用于第一个选择,因为它将:

  1. 首先通过jQuery Mobile

  2. 进行渲染并初始化为选择菜单
  3. 稍后获取新数据并刷新

  4. 但是,在第二种情况下,在<div ng-switch-when="B">实际为MyViewType之前,B内的HTML不会呈现,这与选择的数据准备就绪的同时。

    这意味着两件事:

    1. $watch的代码被执行后,ngModel已经可用,newValueoldValue都将{{1} }},Object {Description: "1"}将不会被执行。

    2. 如果您试图致电if statement,它会抛出 一个错误,因为该元素尚未初始化为a 通过jQuery Mobile选择菜单。

    3. 如果您想使用element.selectmenu('refresh');中的数据填充选择菜单,并且数据在初始化时可用,我会:

      1. 通过设置$scope

      2. 告诉jQuery Mobile不要自动将选择菜单转换为选择菜单
      3. 通过从指令

      4. 调用data-role="none"手动输入选择菜单

        否则你需要一个很好的方法来知道元素何时被jQuery Mobile渲染和初始化,然后调用refresh。

        两种情况的修改指令:

        element.selectmenu();

        工作示例:http://plnkr.co/edit/9jR7ko3j8ugUr1suB8ws?p=preview

        请注意,var unbindInitializationWatch = scope.$watch(attrs.ngModel, function(newValue, oldValue) { if (newValue && oldValue === undefined) { element.selectmenu('refresh'); unbindInitializationWatch(); } else if (newValue && oldValue) { element.selectmenu(); unbindInitializationWatch(); } }); 会创建一个新范围,并且为了让两个选择菜单共享我在示例中选择的选项,将所选选项的模型移动到一个对象中(详情请参阅{{3}如果不熟悉它的工作方式)。

        还添加了额外的ngSwitch来同步两个选择菜单。