Angular ng-click с вызовом функции контроллера, не работающей
Мне нужно передать переменную другому контроллеру. У меня есть следующий код, который связан с ListCtrl:
<a href="#items" data-router="article" ng-click="changeListName('metro')">
Ссылка идет на другой контроллер, ItemCtrl.
Я хочу передать переменную в ItemCtrl. Я думал об использовании сервиса под названием SharedProperties:
service('sharedProperties', function () {
var list_name = '';
return {
getListName: function() {
return list_name;
},
setListName: function(name) {
list_name = name;
}
};
});
При щелчке ссылки я вызываю событие angular click, чтобы вызвать следующую функцию:
$scope.changeListName = function(name) {
sharedProperties.setListName(name);
};
Однако, ng-click, похоже, не меняет значение моего общего свойства...
UPDATE
Я помещаю предупреждение внутри функции, вызванной ng-click, и запускается предупреждение, как и должно быть.
Однако, когда я пишу свою функцию следующим образом:
$scope.changeListName = function(name) {
sharedProperties.setListName(name);
};
Он не работает... он выглядит как 'sharedProperties.setListName(name);' не выполняется...
Если я поставлю его вне функции с фиктивным именем (например, метро), он будет работать.
ОБНОВЛЕНИЕ 3
Я попробовал несколько вещей, и я уверен, что проблема в этой функции:
$scope.changeListName = function(list_name) {
sharedProperties.setListName(list_name);
};
У вас есть идея, почему это происходит?
Ответы
Ответ 1
Вероятно, вы должны использовать директиву ngHref вместе с ngClick:
<a ng-href='#here' ng-click='go()' >click me</a>
Вот пример: http://plnkr.co/edit/FSH0tP0YBFeGwjIhKBSx?p=preview
<body ng-controller="MainCtrl">
<p>Hello {{name}}!</p>
{{msg}}
<a ng-href='#here' ng-click='go()' >click me</a>
<div style='height:1000px'>
<a id='here'></a>
</div>
<h1>here</h1>
</body>
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {
$scope.name = 'World';
$scope.go = function() {
$scope.msg = 'clicked';
}
});
Я не знаю, будет ли это работать с используемой вами библиотекой, но по крайней мере позволит вам связать и использовать функцию ngClick.
** Обновление **
Вот демонстрация набора и работа с продуктом.
http://plnkr.co/edit/FSH0tP0YBFeGwjIhKBSx?p=preview
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope, sharedProperties) {
$scope.name = 'World';
$scope.go = function(item) {
sharedProperties.setListName(item);
}
$scope.getItem = function() {
$scope.msg = sharedProperties.getListName();
}
});
app.service('sharedProperties', function () {
var list_name = '';
return {
getListName: function() {
return list_name;
},
setListName: function(name) {
list_name = name;
}
};
});
* Изменить *
Просмотрите https://github.com/centralway/lungo-angular-bridge, где рассказывается о том, как использовать lungo и angular. Также обратите внимание, что если ваша страница полностью перезагружается при просмотре на другую ссылку, вам нужно будет сохранить свои общие свойства в localstorage и/или cookie.
Ответ 2
Используйте псевдоним при определении контроллера в конфигурации angular. Например:
ПРИМЕЧАНИЕ. Я использую TypeScript здесь
Просто обратите внимание на контроллер, у него есть псевдоним homeCtrl.
module MongoAngular {
var app = angular.module('mongoAngular', ['ngResource', 'ngRoute','restangular']);
app.config([
'$routeProvider', ($routeProvider: ng.route.IRouteProvider) => {
$routeProvider
.when('/Home', {
templateUrl: '/PartialViews/Home/home.html',
controller: 'HomeController as homeCtrl'
})
.otherwise({ redirectTo: '/Home' });
}])
.config(['RestangularProvider', (restangularProvider: restangular.IProvider) => {
restangularProvider.setBaseUrl('/api');
}]);
}
И вот способ его использования...
ng-click="homeCtrl.addCustomer(customer)"
Попробуйте.. Это может сработать для вас, поскольку это сработало для меня...;)
Ответ 3
Я собираюсь предположить, что вы не получаете ошибок, или вы бы упомянули их. В этом случае попробуйте удалить значение атрибута href
, чтобы страница не удалялась до вашего кода. В Angular вполне приемлемо оставить атрибуты href
пустыми.
<a href="" data-router="article" ng-click="changeListName('metro')">
Также я не знаю, что делает data-router
, но если вы все еще не получаете правильный результат, возможно, поэтому.