0

我看过egghead.io关于在控制器之间共享数据的视频,但无法让它工作:

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

myApp.factory('QData', function () {
    return 'hello'
});

function QCtrl($scope, $http, QData) {
  $scope.foo = QData;
}

QCtrl.$inject = ['$scope', '$http', 'QData'];

function YCtrl($scope, $http, QData) {
  $scope.bar = QData;
}

YCtrl.$inject = ['$scope', '$http', 'QData'];

查看在 Plnkr 上运行的代码(带有额外的引导视图)

4

4 回答 4

0

如果您的服务正在更改 QData,而不是 QData 中的属性 - Angular 会丢失对象引用,并且其他控制器不知道发生了什么。

调整您的代码并添加使用 $timeout 来模拟更新 QData 的 $http 请求。分叉你的plunker - 但下面的相关 JS 代码。

'use strict';

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

myApp.factory('QData', function () {
    return { text: 'hello' } ;
});

function QCtrl($scope, $http, QData, $rootScope) {
  $scope.foo = QData;
}

QCtrl.$inject = ['$scope', '$http', 'QData', '$rootScope'];

function YCtrl($scope, $http, QData, $rootScope,$timeout) {
  $scope.bar = QData;
  $rootScope.globe = 5;
  $timeout(function()
  {
    QData.text = "Test!"
  },5000);

}

YCtrl.$inject = ['$scope', '$http', 'QData', '$rootScope','$timeout'];
于 2013-06-26T21:23:01.163 回答
0

您应该直接使用中间对象及其属性。

像这样

于 2013-06-26T20:38:23.750 回答
0
var myApp = angular.module('myApp', []);

myApp.factory('QData', function () {
    return 'hello' 
});

function ParentCtrl($scope, $http, QData) {   
    $scope.foo = 'My data'; 
}

QCtrl.$inject = ['$scope', '$http', 'QData'];

function QCtrl($scope, $http, QData) {  }

QCtrl.$inject = ['$scope', '$http', 'QData'];

function YCtrl($scope, $http, QData) { }

YCtrl.$inject = ['$scope', '$http', 'QData'];
于 2013-06-26T20:38:53.247 回答
0

我认为出现问题是因为您的工厂正在返回一个字符串。并且字符串的行为与 js 中的对象不同(iirc,当它们被视为对象时,它们被包装成对象,否则它们是原语)。例如

var a = 'hello';
var b = a;
a.x = 1;
console.log(b.x) //undefined

var a = {x: 1}; var b=a; a.y = 1; console.log(b.y); //1

基本上,如果你使用对象会更好,比如这里:http ://plnkr.co/edit/zqCPn9?p=preview

于 2013-06-26T20:41:29.077 回答