2015-07-18 3 views
0

я добавляю некоторые дивы в моей HTML страницу в Angularcontroller:Угловой нг щелкните внутри динамически созданные Div-й не работает

jQuery("#mytag").after('<div ng-click="sayHi()">Hi</div>'); 

и sayHi метод является Angular Метода внутри controller:

$scope.sayHi = function() { 
     alert("hi"); 
}; 

Но ng-click внутри этих динамически созданных Div's не работает! Зачем?

+0

Вы можете создать код или jsfiddle, чтобы продемонстрировать свою проблему? – Himmel

+7

Это не правильный способ сделать динамический HTML с угловым. В угловом режиме вы всегда должны программировать свои данные и никогда не использовать DOM. Использование JQuery, как это, редко необходимо, за исключением случаев экстремальных краев, и когда это так, рекомендуется поместить в директиву, где ее можно перекомпилировать.Возможно, если вы продемонстрируете, что вы пытаетесь выполнить с помощью кода, мы можем показать «угловой способ» для выполнения задачи. – Claies

+1

@ Химмель почему - проблема очевидна. Новый html не компилируется угловым – charlietfl

ответ

2

Таким образом, вместо jQuery("#mytag").after('<div ng-click="sayHi()">Hi</div>');

Вы должны иметь:

function myTag() { 

    return { 
     link: function(element) { 
      element.after('<div ng-click="sayHi()">Hi</div>'); 
     } 
    } 
} 
angular.module('yourModule').directive('myTag', myTag); 

Тогда на ваш взгляд, вместо того, чтобы делать что-то вроде:

<div id="mytag"></div> 

Вы должны иметь:

<my-tag></my-tag> or <div my-tag></div> 

Обновление Как отмечает @Claies, это тоже не чистый подход к загрузке более или бесконечной прокрутки.

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

Предположим, мы знаем, что у вас есть только около 100 записей для отображения. Пользователь, вероятно, только хочет увидеть первые 20, но тогда у пользователя будет возможность увидеть еще 20 после этого и снова ... пока не отобразятся все 100 записей.

В этом случае, вероятно, будет нормально загружать все эти записи в браузер и фильтровать их на стороне клиента в Угловом. Опять же, это может быть не ваша ситуация. Я не знаю, что вы связываете.

Таким образом, на ваш взгляд, вы можете иметь фильтр, который ограничивает их для первых 20 записей. Затем выполните действие, которое увеличивает фильтр на 20 записей. Когда ограничение фильтра больше или равно количеству записей, скройте кнопку больше.

<div ng-repeat="record in vm.records | limitTo : vm.display"> 
    {{ record }} 
</div> 
<button ng-show="vm.enableLoadMore" ng-click="vm.showMore()">Load More</button> 

В контроллере для этой точки зрения, используя controllerAs синтаксис: только

function RecordsController() { 

    this.records = [ . . . ]; // your records 

    this.display = 20; // number of records to display 

    var self = this; 

    Object.defineProperty(this, 'enableLoadMore', { get: function() { 
     return self.records >= self.display; 
    }}) 
} 

RecordsController.prototype.showMore = function() { 
    this.display += 20; 
} 
+0

это, безусловно, будет работать и устраняет вызов jquery (и необходимость '$ compile' или' $ scope. $ Apply() '), но все равно такая же плохая логика проектирования, просто переместилась в новое место. Он по-прежнему пытается запрограммировать DOM, а не программировать данные. – Claies

+0

Я уверен. Это надуманный пример. Я обновляю его чем-то более подходящим. – Martin

1

угловой компилирует HTML, когда он инициализируется первый раз ,, если вы хотите перекомпилировать его можно вводить $ компилировать услуги в контроллер и использовать его как этот

$compile(element)(scope) 

, но это не правильный способ, чтобы динамически добавлять элементы в угловых Можете ли вы сказать мне, что именно вы пытаетесь построить?

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