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, но если вы все еще не получаете правильный результат, возможно, поэтому.