с этой Angular директивой каждый раз, когда моя модель меняется, новый элемент HTML, прикрепленный к странице:
app.directive('helloWorld', function($compile) {
return {
restrict: 'AE',
replace: true,
scope:{
arrayItem: '=ngModel'
},
link: function ($scope, ele, attrs) {
$scope.$watch( 'ngModel' , function(){
ele.html('<div ng-click="sendLike({{arrayItem.data.timeline_content}})" class="timeline-item"> Hello {{arrayItem2.data.timeline_content}} </div>');
$compile(ele.contents())($scope);
});
}
};
});
И это HTML-представление:
<hello-world ng-repeat="arrayItem in arr" ng-model="arrayItem"></hello-world>
Но ng-click внутри динамически генерируемого HTML не работает. фактически перекомпиляция этого нового добавленного раздела не работает.
ОБНОВИТЬ:
это то, чего я хочу достичь:
на самом деле я хочу создать чат-приложение. сообщения, хранящиеся внутри массива, и я должен привязать этот массив к виду HTML. если я нажимаю на каждое сообщение, мне нужно вызвать предупреждение(), запущенное внутри контроллера. мой контроллер выглядит так:
app.controller("timelineCtrl", function ($scope) {
$scope.arr={};
$scope.sendLike = function (id) {
alert(id);
};
.
.
.
}
в способе jQuery я просто использую методы манипуляции с DOM и добавляю новые теги для каждого сообщения, но по Угловому пути мне нужно связать этот массив как ng-модель или что-то в этом роде.
на первый взгляд, я понимаю, что разработка директивы должна быть хорошей идеей, а внутри модуля я могу получить доступ к основной области и делать что-то нужное с этой директивой, и я ожидаю, что изменения внутри этой директивы будут проецироваться в представление HTML, но это терпит неудачу, и такие вещи, как ng-click не работает для динамически создаваемых тегов.
Это можно сделать двумя способами: с директивой или без нее.
Пусть начинается без директивы; мы предположим, что у вас есть массив в контроллере.
<div ng-controller="timelineCtrl" class="timelineframe">
<div ng-repeat="post in timeline | orderBy:'-lineNumber'" class="post">
<div ng-click="sendAlert(post)">
<span class="postnumber">{{::post.lineNumber}}:</span>
<span class="message">{{::post.message}}</span>
</div>
</div>
</div>
всякий раз, когда объект добавляется к $ scope.timeline, ему может быть присвоен номер lineNumber
, и мы можем использовать угловой OrderBy
для сортировки направления в обратном порядке. lineNumber
порядка (с использованием -
). $scope.sendAlert(post)
отправит конкретную запись функции. в наших привязках мы используем ::
чтобы указать, что это однократные привязки, т.е. не значения, которые необходимо контролировать независимо от массива. Это может улучшить производительность в больших списках.
используя Директиву, мы можем сделать это очень похожим образом, создав Директиву, которая отображает конкретную запись, и передавая сообщение в качестве свойства.
app.directive('timelinePost', function() {
return {
restrict: 'AE',
scope:{
post: '='
},
template: '<div ng-click="postCtrl.sendAlert()">
<span class="postnumber">{{::postCtrl.post.lineNumber}}:</span>
<span class="message">{{::postCtrl.post.message}}</span>
</div>',
controller: 'postController',
controllerAs: 'postCtrl',
bindToController: true
};
app.controller("postController", function(){
var self = this; //save reference to this
self.sendAlert = function(){
//the specific post is available here as self.post, due to bindToController
};
};
//usage in HTML:
<div ng-controller="timelineCtrl" class="timelineframe">
<div ng-repeat="post in timeline | orderBy:'-lineNumber'" class="post">
<timeline-post post='post'></timeline-post>
</div>
</div>
вы могли бы еще раз обернуть эту временную шкалу в директиве аналогичным образом, если хотите. Любой из них выполнит одну и ту же задачу: перебирает ваши данные, заказывая их так, чтобы последняя запись была наверху и обновлялась всякий раз, когда изменяется массив. В методе non-directive timelineCtrl
обрабатывает функцию $scope.sendAlert
; в методе директивы он обрабатывается postController
.
Обратите внимание, что это приблизительный проект, основанный на том, что вы описали, и информации из разных должностей за последние 2 дня. Я не создал набор данных для итерации, чтобы тщательно протестировать, но логика здесь должна помочь вам начать.
ele.html
не будет работать лучше, чем первый пример, который вы опубликовали вчера с помощью JQuery. После 6 вопросов все еще неясно, что вы на самом деле пытаетесь достичь здесь; Вы продолжаете задавать вопросы XY без объяснения всей картины.sendLike
потому что это изолированная директива