2015-03-20 5 views
0

Мне нужно зафиксировать событие изменения на моих ячейках (динамически заполненное), но только триггеры первого элемента функционируют «эврика». Кто-то знает, что я делаю неправильно?Изоляция угловой директивной области

Мой HTML:

  <div ng-controller="TreeCtrl"> 

       <tree family="treeFamily" done="eureka()"> 



       </tree> 

      </div> 

Вот мой контроллер:

module.registerController("TreeCtrl", function($scope) { 


    $scope.eureka = function() { 
     alert("it works!!"); 
    } 


    $scope.treeFamily = { 
     name : "Parent", 
     children: [{ 
      name : "Child1", 
      checked : true, 
      children: [{ 
       name : "Grandchild1", 
       children: [] 
      },{ 
       name : "Grandchild2", 
       checked : true, 
       children: [{ 
        name : "GrandGrandchild2", 
        checked : true, 
        children: [] 
       }] 
      },{ 
       name : "Grandchild3", 
       checked : false, 
       children: [] 
      }] 
     }, { 
      name: "Child2", 
      checked : true, 
      children: [] 
     }] 
    }; 


}); 

Моя директива:

module.registerDirective("tree", function($compile) { 
     return { 
      restrict: "EA", 
      scope: { 
       ngModel: '=', 
       ngChange: '&', 
       done: '&', 
       family: '=', 
      }, 
      template: 
       '<p>{{ family.name }} <input type="checkbox" value="1" ng-model="family.checked" ng-change="done()"><button ng-click="done()">dsfdsfsd</button></p>'+ 
       '<ul>' + 
        '<li ng-repeat="child in family.children">' + 
         '<tree family="child"></tree>' + 
        '</li>' + 
       '</ul>', 
      compile: function(tElement, tAttr) { 
       var contents = tElement.contents().remove(); 
       var compiledContents; 
       return function(scope, iElement, iAttr) { 
        if(!compiledContents) { 
         compiledContents = $compile(contents); 
        } 
        compiledContents(scope, function(clone, scope) { 
          iElement.append(clone); 
        }); 
       }; 
      } 
     }; 
    }); 

Спасибо!

С наилучшими пожеланиями

ответ

1

Я сделал этот вид рекурсивной директивы вещь, прежде чем ... весело :). В любом случае, вы можете пройти через ссылку. т.е.

scope: { 
    ngModel: '=', 
    ngChange: '&', 
    done: '=', 
    family: '=', 
}, 

вам также придется внести несколько изменений. а именно, вы должны были бы определить другую функцию в области вашей директивы. И есть ссылка шаблон, что функция вместо глобальной функции

$scope.localDone = function(){ 
    $scope.done() // this is your ereka function 
}; 

и в вашем HTML пропуск делается ссылка

<tree family="treeFamily" done="eureka"> // no() 

и в шаблоне директивы вместо вызова сделать вызов, localDone

template: 
      '<p>{{ family.name }} <input type="checkbox" value="1" ng-model="family.checked" ng-change="localDone()"><button ng-click="done()">dsfdsfsd</button></p>'+ 

Надеюсь, это поможет!

+0

Здравствуйте Аарон, спасибо за ответ. Я попробовал изменить '&' с '=' в проделанной функции, но теперь «eureka()» запускается в вечном цикле при загрузке страницы. Вы знаете, почему? – manuelbcd

+0

@manuelbcd hum ... Вы также изменили свой атрибут html done = 'eureka' from done = 'eureka()'? – Aaron

+0

Вы правы, делая это, «вечный цикл» исправлен, но все еще не работает в моем примере. Тем не менее, в файле patbaker82 code snippet он отлично работает, и я не знаю, почему – manuelbcd

0

Вы можете посмотреть этот пример, который использует требования и разделяет директивы.

http://jsfiddle.net/KRDEf/

Изменение области связывания с = по-видимому, проблема будет устранена, однако.

var app = angular.module('app', []); 
 

 
app.controller("TreeCtrl", function($scope) { 
 

 

 
    $scope.eureka = function() { 
 
    alert("it works!!"); 
 
    } 
 

 

 
    $scope.treeFamily = { 
 
    name: "Parent", 
 
    children: [{ 
 
     name: "Child1", 
 
     checked: true, 
 
     children: [{ 
 
     name: "Grandchild1", 
 
     children: [] 
 
     }, { 
 
     name: "Grandchild2", 
 
     checked: true, 
 
     children: [{ 
 
      name: "GrandGrandchild2", 
 
      checked: true, 
 
      children: [] 
 
     }] 
 
     }, { 
 
     name: "Grandchild3", 
 
     checked: false, 
 
     children: [] 
 
     }] 
 
    }, { 
 
     name: "Child2", 
 
     checked: true, 
 
     children: [] 
 
    }] 
 
    }; 
 

 

 
}); 
 

 
app.directive("tree", function($compile) { 
 
    return { 
 
    restrict: "EA", 
 
    scope: { 
 
     ngModel: '=', 
 
     ngChange: '&', 
 
     done: '=', 
 
     family: '=', 
 
    }, 
 
    template: '<p>{{ family.name }} <input type="checkbox" value="1" ng-model="family.checked" ng-change="done()">' +  '<button ng-click="done()">dsfdsfsd</button></p>' + 
 
     '<ul>' + 
 
     '<li ng-repeat="child in family.children">' + 
 
     '<tree family="child"></tree>' + 
 
     '</li>' + 
 
     '</ul>', 
 
    compile: function(tElement, tAttr) { 
 
     var contents = tElement.contents().remove(); 
 
     var compiledContents; 
 
     return function(scope, iElement, iAttr) { 
 
     if (!compiledContents) { 
 
      compiledContents = $compile(contents); 
 
     } 
 
     compiledContents(scope, function(clone, scope) { 
 
      iElement.append(clone); 
 
     }); 
 
     }; 
 
    } 
 
    }; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script> 
 
<div ng-controller="TreeCtrl" ng-app="app"> 
 

 
    <tree family="treeFamily" done="eureka()"> 
 
    </tree> 
 

 
</div>

+0

Спасибо patbaker82, это прекрасно и работает, но когда я копирую в свое приложение smart-admin, проблема остается, только первые триггерные действия элемента! Я не знаю, почему, но это действительно скучно. Есть идеи? – manuelbcd

+0

Какая версия Angular? В примере используется 1.3.15 – patbaker82

+0

Версия была старше, но вчера пробовала с той же версией (1.3.15), но без решения – manuelbcd

Смежные вопросы