Collection-Repeat和$ ionicModal奇怪的行为

时间:2014-10-28 15:09:57

标签: javascript angularjs ionic-framework

我正在创建一个包含大约200个列表项(员工)的目录应用程序。该应用程序使用ng-repeat按预期工作,但加载缓慢。我改用Collection-Repeat来充分利用速度提升,但我得到的奇怪行为让我无法理解。

列表项目正确呈现,按字母顺序添加成功添加类别标题。问题是,每个列表项都有一个ng-click属性,可以打开$ ionicModal。打开每个项目的模态,但加载的数据不正确。

当模态打开时,它从页面底部开始 - 我可以看到内容半秒,然后动画到屏幕中间。首先,加载的数据是正确的。随着它的动画,它切换到另一个员工数据。我似乎无法弄清楚原因。我是角度/离子的新手,所以任何指针都会很棒。谢谢!

编辑 - 出于好奇,我在每个元素中添加了第二个ng-controller="ModalCtrl" ng-click="openModal();"作为按钮。通常点击元素 - 用错误的员工打开模态。点击新创建的按钮然后创建两个模式(彼此堆叠)与正确的员工一起。将实例移除到ng-controller或ng-click会使我回到方形一,只有一个模态的错误数据。为什么是这样?为什么添加第二次ng-click可以解决问题(尽管有两个模态)?

编辑 - 这是一个指向codepen示例的链接(愚蠢,但证明了我的问题: http://codepen.io/anon/pen/zijFv?editors=101

我的HTML看起来像这样:

<div class="list">
   <a class="item my-item"            
      collection-repeat="row in contacts"
      collection-item-height="getItemHeight(row)"
      collection-item-width="'100%'"
      ng-class="{'item-divider': row.isLetter}">

      <!-- ADDED BUTTON SEE EDIT COMMENT ABOVE -->
      <button ng-if="!row.isLetter" ng-controller="ModalCtrl" ng-click="openModal();">Click</button>

      <img ng-controller="ModalCtrl" ng-click="modal.show()" ng-if="!row.isLetter" ng-src="data:image/jpeg;base64,{{row.image}}">
      <h2>{{row.title || (row.firstname+' '+row.lastname)}}</h2>
      <p ng-if="!row.isLetter"><em>{{row.jobtitle}}</em></p>                   
   </a>
</div>

我的模态HTML是这样的:

<header class="bar bar-header bar-lsi">
  <h1 class="title">Contact Information</h1>
  <div class="button button-clear" ng-click="closeModal()">
    <span class="icon ion-close"></span>
  </div>
</header>

<ion-content has-header="true" style="margin-top: 0px !important;">        

  <div class="list card" style="border-radius: 0px !important;">

     <div class="item item-avatar item-text-wrap">
       <img ng-src="data:image/jpeg;base64,{{row.image}}">
       <h2>{{row.firstname}} {{row.lastname}}</h2>
       <p>{{row.jobtitle}}</p>
     </div>

     <a href="tel:{{row.phone}}" class="item item-icon-left">
       <i class="icon ion-iphone"></i>
       {{row.phone}}
     </a>

     <a href="mailto:{{row.email}}" class="item item-icon-left">
      <i class="icon ion-email"></i>
      {{row.email}}
     </a>         

   </div>

</ion-content>

然后我有了我的基本控制器:

.controller('ModalCtrl', function($scope, $ionicModal) {

    $ionicModal.fromTemplateUrl('my-modal.html', { 
        scope: $scope, 
        animation: 'slide-in-up'
    }).then(function(modal) {
        $scope.modal = modal;
    });
    $scope.openModal = function() {
        $scope.modal.show();
    };
    $scope.closeModal = function() {
        $scope.modal.hide();
    };

    $scope.$on('$destroy', function() {
        $scope.modal.remove();
    });

})

1 个答案:

答案 0 :(得分:2)

我认为问题在于你没有将任何值传递给模态模板。它获得了剩余价值。我也看到你在使用过多的ng-controller和ng-click项目列表以及里面的内容。我的意思是,如果您对A.item使用ng-click,则不需要对其中的图像使用ng-click。

让我们看一些代码:

<a class="item my-item"
   collection-repeat="row in contacts"
   collection-item-height="getItemHeight(row)"
   collection-item-width="'100%'"
   ng-class="{'item-divider': row.isLetter}"
   ng-controller="ModalCtrl" ng-click="openModal(row);">

       <img ng-if="!row.isLetter" ng-src="http://placehold.it/65x65">
       <h2>{{row.title || (row.firstname+' '+row.lastname)}}</h2>
       <p ng-if="!row.isLetter"><em>{{row.jobtitle}}</em></p>
</a>

正如您所看到的,我已经删除了A标签内的所有ng-click和ng-controller,而且我只留下了A标签的属性。您也可以注意到我将对象row传递给openmModal()函数。

在控制器中,我做了下一个更改:

$scope.openModal = function(item) {
   $scope.modal.row = item;
   $scope.modal.show();
};

在模态模板中,我使用modal.row作为变量,触摸了项目列表中的数据。所以在模板中我使用它:

<div class="item item-avatar item-text-wrap">
    <img ng-src="http://placehold.it/65x65">
    <h2>{{modal.row.firstname}} {{modal.row.lastname}}</h2>
    <p>{{modal.row.jobtitle}}</p>
</div>

<a href="tel:{{modal.row.phone}}" class="item item-icon-left">
    <i class="icon ion-iphone"></i>
    {{modal.row.phone}}
</a>

<a href="mailto:{{modal.row.email}}" class="item item-icon-left">
    <i class="icon ion-email"></i>
    {{modal.row.email}}
</a>         

我已经在您的codepen中测试它并且它可以工作。试一试,告诉我它是否适合你。