【问题标题】:Same controller for multiple ng-app多个 ng-app 的相同控制器
【发布时间】:2015-08-23 02:32:43
【问题描述】:

我有一个网页,它有不同的documents.php,每个文档都有它的ng-app 和一些控制器。 (我的网页类似于 Spotify)。

player.php:(用户可以使用音频播放器播放音乐)

<div class="navbar-fixed" ng-controller="menuController as menu2">
<?php include('includes/menu.php'); ?>
</div>
<div ng-controller="InteractiveController as interactCtrl">
//some code
</div>

panel_admin.php:(用户可以修改自己的数据和网页的部分数据)

<div class="navbar-fixed" ng-controller="menuController as menu2">
<?php include('includes/menu.php'); ?>
</div>
<div ng-controller="AdminController as AdminCtrl">
//some code
</div>

player.php 和 panel_admin.php 有各自的 player.js 和 panel_admin.js 及其 .controllers。

player.js:

var decibelsInteractive = angular.module("decibels-interactive", []);
decibelsInteractive.controller('InteractiveController', function ($scope, $log) {

panel_admin.js:

var adminControl = angular.module("decibels-admin", []);
adminControl.controller("AdminController", function($scope){

现在,我在 menu.php 中有菜单栏,我在 player.phppanel_admin.php 文档中使用。我导入它是因为我不想在需要使用菜单的每个页面中重复代码(menu.php 具有管理用户选项、注销和许多其他选项等选项......)。我还创建了一个 menu.js,只在一个文档中包含特定方法,而不是在 25 个文档中。

menu.php:(菜单是一个菜单栏,用户有一些选项,它也有它的用户名和注销选项)

//this document only contains some html code

现在,我尝试实现一个简单的代码(在 menu.js 中),它允许我在有多个 ng-app 时共享一个控制器。

Question with the code I've taken

menu.js:

angular.module('decibels-interactive', ['shared']); //player2.php
angular.module('decibels-admin', ['shared']); //panel_admin.php
var sharedModule=angular.module('shared',[]);

sharedModule.controller('menuController',['$scope',function($scope) {
alert("menuController");
}]);   
});

这成功了!!!但是,角度显示错误...(正在加载 player.php)

错误:[ng:areq]http://errors.angularjs.org/1.2.25/ng/areq?p0=InteractiveController&p1=not%20a%20function%2C%20got%20undefined

当我加载 panel_admin 时,同样的错误再次出现,但使用 AdminController...

似乎angular只检测到每个.php中的第一个控制器,而找不到第二个。

我做错了什么?

谢谢!

【问题讨论】:

  • 仅供参考,混合 PHP 和 AngularJS 可能不是最好的。现在可能为时已晚,但请查看以下答案:stackoverflow.com/a/15625754/2506594
  • @DevinH。是的,我知道如果我只做-angularJS,会更容易,但我没有太多时间来更改我所有的网页!无论如何,谢谢!

标签: javascript angularjs


【解决方案1】:

您可以为共享代码创建一个文件,并在其中包含控制器代码。

// @file mySharedCode.js
var MySharedCode = MySharedCode || {};

MySharedCode.menuController = function($scope) {
    // controller logic
};

然后,在你的 app.js 文件中调用 menuController 函数

// @file app.js
sharedModule.controller('menuController', MySharedCode.menuController);

【讨论】:

  • 感谢您的回答。我不明白我必须做什么。我必须创建一个新文件 @file mySharedCode.js,,然后例如从 player.js 调用它?或者可能在 menu.js 中?
  • 使用答案中解释的控制器代码创建一个新的 js 文件 mySharedCode.js,并将其包含在您的 html 文件中(在调用 angular 之前)。然后在 player.jsapp.js 中像这样调用控制器:sharedModule.controller('menuController', MySharedCode.menuController);
  • 我试过你的代码,但没有成功。在调用 angular 之前,我已经链接了 mySharedCode.js,并且我已经将 sharedModule.controller 放在 player.js 的不同部分,同样的问题仍然存在:@987654326 @。啊,共享控制器总是工作,因为我在这里有一个 alert(),它会在屏幕上显示消息。
  • 创建一个 plunker / fiddle / jsBin 并分享链接。
  • 这里有所有受影响的文档:link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
相关资源
最近更新 更多