如何从控制器外部将值传递到范围?

时间:2014-02-28 20:48:01

标签: javascript angularjs function angularjs-scope angular-ui

我是角度世界的新手,我有一个函数,它在加载时在内部加载html,然后控制器初始化。我想在控制器内部提供单个var,因此想知道是否可以从控制器外部将var分配给范围。

//controller 
var cntlrs = angular.module('MyModule');

cntlrs.controller('ControllerTest', function ($scope, $http) {
    //want to have var available here from $scope   
});


//accessing scope from outside
var appElmt = document.querySelector('[ng-app=MyApp]');
var $scope = angular.element(appElmt).scope();
var customer = "New Customer";

//how can I set customer value inside scope?  

3 个答案:

答案 0 :(得分:1)

我建议更多地阅读角度文档。 $ scope是你的模型(或者可能是ViewModel这个术语更合适)。

要将值输入控制器,我建议您使用工厂或服务。可以在工厂调用setCustomer,然后其他控制器可以使用getCustomer查看该值。

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

mod.factory("CustomerFactory", function () {
    var customer;
    return {
        getCustomer: function () {
            return custData;
        }
        setCustomer: function (custData) {
            customer = custData;
        }
    }
});

mod.controller("TestController", function ($scope, $http, CustomerFactory) {
    $scope.customer = CustomerFactory.getCustomer();
}

如果你没有在angular之外引用$ scope(也就是来自angular.element(...)。scope()),也可能会更好。我不知道你要解决的是什么,但似乎从上面的代码中,所有逻辑都可以放在控制器中。

答案 1 :(得分:0)

是的,从控制器外部可以定位角度控制器内的元素:

var scope = angular.element("#YourElementID").scope();

现在您可以访问scope上的所有内容(就像您使用$scope一样)

答案 2 :(得分:0)

我决定这样工作,似乎没事!它不需要很大的努力,唯一无聊的部分是在模板中你需要始终使用vars.somepropertyormethod

//an outside var that keeps all the vars I want in my scope
var vars = {
    val1: 1,
    val2: "dsfsdf",
    val3: function() {return true;}
}


//and here I set the controller's scope to have ONLY vars and nothing else:
angular.module('myModule', [])
    .controller('myControllerOpenToTheWorld', function($scope) { 
        $scope.vars = vars; 
    });

有了这个,我可以在任何我想要的地方设置vars.anyproperty。诀窍是真正的值都包含在一个对象中,所以只要你不重新分配包装器vars,就可以从外部和内部访问它:

//change val2
vars.val2 = "new value changed from outside";

在标记中,它会像这样工作:

<div>{{vars.val1}}</div>
<div ng-if:"vars.val3()">{{vars.val2}}</div>