77

我需要将变量传递给另一个控制器。我有以下与 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;
        }
    };
});

单击链接时,我会调用角度单击事件来触发以下功能:

$scope.changeListName = function(name) {
    sharedProperties.setListName(name);
};

但是,ng-click 似乎并没有改变我的共享属性的值......

更新

我在由 ng-click 触发的函数中放置了一个警报,并触发了警报,这是应该的。

但是,当我这样编写函数时:

$scope.changeListName = function(name) {
    sharedProperties.setListName(name);
};

它不起作用......它看起来像 'sharedProperties.setListName(name);' 没有被执行...

如果我用一个虚拟名称(例如metro)将它放在函数之外,它可以工作..

更新 3

我尝试了多种方法,我非常确信问题出在这个函数上:

$scope.changeListName = function(list_name) {
    sharedProperties.setListName(list_name);
};

你知道为什么会这样吗?

4

3 回答 3

105

您可能应该将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。另请注意,如果您的页面在浏览到另一个链接时完全重新加载,您需要将共享属性保存到本地存储和/或 cookie 中。

于 2013-07-03T20:44:00.157 回答
5

在角度配置中定义控制器时使用别名。例如: 注意:我在这里使用 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)"

试试看..它可能对你有用,因为它对我有用……;)

于 2014-08-31T03:28:35.097 回答
3

我猜你没有收到错误,或者你会提到它们。如果是这种情况,请尝试删除href属性值,以便在执行代码之前页面不会离开。href在 Angular 中,将属性留空是完全可以接受的。

<a href="" data-router="article" ng-click="changeListName('metro')">

另外我不知道data-router在做什么,但是如果您仍然没有得到正确的结果,那可能就是原因。

于 2013-07-03T20:02:08.470 回答