2013-11-26 3 views
1

Я пытаюсь добавить прослушиватель JQuery на кнопку, которая печаталась с AngularJS, слушатель не работает, поскольку элемент не доступен на DOM:AngularJS документ готов не работает

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

socket.on('datasources/update:done', function() { 
    socket.emit('datasources/list'); 
}); 

socket.emit('datasources/list'); 
app.factory('socket', function ($rootScope) { 
    return { 
    on: function (eventName, callback) { 
     socket.on(eventName, function() { 
     var args = arguments; 
     $rootScope.$apply(function() { 
      callback.apply(socket, args); 
     }); 
     }); 
    }, 
    emit: function (eventName, data, callback) { 
     socket.emit(eventName, data, function() { 
     var args = arguments; 
     $rootScope.$apply(function() { 
      if (callback) { 
      callback.apply(socket, args); 
      } 
     }); 
     }) 
    } 
    }; 
}); 

function dslist($scope, socket) { 
    socket.on('datasources/list:done', function (datasources) { 
    $scope.datasources = datasources.datasources; 
    }); 
} 

angular.element(document).ready(function() { 
    $('.delete-data-source').on('click', function(event) { 
    console.log('a'); 
    }) 
}); 

HTML тег (нефрит):

html(lang='en', ng-app="myapp" xmlns:ng="http://angularjs.org") 

Соответствующий орган HTML (нефрит):

.box-content(ng-controller="dslist") 
       table.table.table-bordered.table-striped 
        thead 
        tr(role="row") 
         th: strong Name 
         th: strong Type 
         th: strong Tables 
         th: strong Records 
         th: strong Status 
         th: strong Action 
        tbody 

        tr(ng-repeat="ds in datasources", ng-cloak) 
         td {{ds.name}} 
         td {{ds.type}} 
         td {{ds.numTables || 0 }} 
         td {{ds.numRecords || 0 }} 
         td {{ds.status || 'UNKNOWN' }} 
         td: button.delete-data-source(data-id="{{ds.name}}") Delete 
+0

во-первых, в угловом приложение должно связывать события внутри угловой. Вы думаете, что «jQuery first» - плохой подход. Даже если это был хороший подход, вы не используете делегирование событий в jQuery, который вы написали. – charlietfl

+1

должен прочитать следующее: [how-do-i-think-in-angleularjs-if-i-have-a-jquery-background] (http://stackoverflow.com/questions/14994391/how-do-i-think -in-angularjs-if-i-have-a-jquery-background) – charlietfl

+0

@charlietfl Это выглядит потрясающе, читая его сейчас! Благодарю. –

ответ

2

Попробуйте это:

$(document).on('click', '.delete-data-source', function(event) { 
    console.log('a'); 
}); 

Но я думаю, что у вас неправильный подход. Вы должны иметь что-то вроде этого:

<div ng-repeat="datasource in datasources"> 
    <input type="button" ng-click="remove(datasource)" value="remove"/> 
</div> 

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

$scope.remove = function(datasource){ 
    $scope.datasources.splice($scope.datasources.indexOf(datasource), 1); 
} 
+0

Это работает, но почему-то только на втором клике. Не могли бы вы объяснить разницу между вашим кодом и моим? –

+0

Разница в том, что мой код прослушивает событие щелчка документов, а затем выясняет, имеет ли элемент clicked '.delete-data-source' класс asigned, и ваш код пытается найти элемент с классом' .delete-data-source', но он еще не добавлен к dom, так что не могу найти его – karaxuna

+0

Спасибо, отлично работает. –

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