2016-02-12 32 views
1

作为AngularJs中的新手无法理解问题。AngularJs。在指令中更改模型太慢

这是一个显示动作的简单示例。实际上约50个项目,点击“没有字符串”后点击元素“字符串#”以视觉上删除该项目大约需要1-2秒。

Fiddle

我的控制器代码:

testApp.controller('TestController', ['$scope', function ($scope) { 

    $scope.category = [ 
     {id:1, name: "Category 1"}, 
     ... 
    ]; 

    $scope.items = [ 
     {id: 1, category: {id: 1},name: "Test 1"}, 
     ... 
    ]; 

    $scope.list = [ 
     {id: 1,name: "String 1"} 
     ... 
    ]; 

    angular.forEach($scope.category, function(categoryItem, i) { 
     categoryHash[categoryItem.id] = i; 
    }); 

    angular.forEach(menuItems, function(item) { 
     var catCategory = categoryHash[item.category.id]; 
     if (!$scope.category[catCategory].items) { 
     $scope.category[catCategory].items = []; 
     } 
     $scope.category[catCategory].items.push(item); 
    }); 

}]) 

指令代码:

.directive('listItems', function() { 
    return { 
     restrict: 'E', 
     scope: { 
      listArray: '=', 
      listItemId: '=', 
      listFlag: '=' 
     }, 
    template: '<ul>' + 
     '<li ng-repeat="listStr in listArray track by listStr.id">' + 
     '<input type="radio" ' + 
      'id="list_{{ listItemId }}_{{ listStr.id }}" name="list_{{ listItemId }}" ' + 
      'ng-model="$parent.$parent.item.string" ng-value="listStr" ng-change="stringSelect()">' + 
     '<label for="list_{{ listItemId }}_{{ listStr.id }}" ng-bind="listStr.name"></label>' + 
     '</li>' + 
     '<li>' + 
     '<input type="radio" ' + 
       'id="list_{{ listItemId }}_0" name="list_{{ listItemId }}" ' + 
       'ng-model="$parent.$parent.item.string" ng-value="" ng-change="stringSelect()">' + 
     '<label for="list_{{ listItemId }}_0">Without string</label>' + 
     '</li>' + 
    '</ul>', 
    link: function(scope, iElement, iAttrs) { 
     scope.stringSelect = function() { 
      scope.listFlag = false; 
     }; 
    } 
    } 
}) 

模板:

<div ng-app="test" ng-controller="TestController"> 
    <div ng-repeat="collection in category track by $index" > 
    <h3 ng-bind="collection.name"></h3> 
    <ul> 
    <li ng-repeat="item in collection.items track by $index"> 
     <strong ng-bind="item.name"></strong> 
     <span ng-if="item.string" ng-bind="item.string.name"></span> 
     <button ng-click="addString = true" ng-hide="addString">Add String</button> 
     <div ng-if="addString"> 
     <list-items 
        list-array="list" 
        list-item-id="$parent.item.id" 
        list-flag="$parent.addString"></list-items> 
     </div> 
    </li> 
    </ul> 
    </div> 
</div> 
+0

它在捣鼓我很即时。 – DoctorMick

回答

2

首先删除所有$父母,他们是不需要ed,angular将自己在初始范围内寻找值,如果您的指令在其他指令中使用,这甚至不会指向正确的范围。

第二与角度,你可以创造出很多的手表,这真的可以放慢您的应用程序:

    当名单的角度看,他看的深度检测
  1. 。当你有一些复杂对象的列表时,这可能会变慢。
  2. 当您使用{{}}或NG绑定,它创建了一个手表

3:您使用的是旧版本的IE?我认为第8版在角度1.2和范围上真的很慢。

所以,你可能会尝试不使用默认手表的数组,但自己处理它只看例如长度。对于{{}}一部分,因为1.3可以前缀您通过结合“::”有一次结合https://docs.angularjs.org/#!/guide/expression),所以他不会看更改

4:当您使用NG-如果销毁对象时,没有必要再重新建立时条件为真又也许你应该用纳克出现,而不是NG-如果有

<div ng-if="addString"> 
+0

谢谢,它的帮助! – user3843670