AngularJS:将服务属性绑定到控制器

时间:2015-11-05 07:19:37

标签: javascript angularjs angularjs-scope

我刚开始使用ngJS。

我找到了将服务objects绑定到控制器的方法。

我想知道,这是实现这一目标的好方法,还是有推荐的方法来做到这一点?

我还想知道为什么这只能在objects而不是properties上实现?

这是我的fiddle。 深入解释是受欢迎的。

感谢。

2 个答案:

答案 0 :(得分:1)

阅读此SO thread

  

variable可以包含两种类型的值之一:primitive values and reference values

     
      
  • Primitive values是存储在堆栈上的数据。
  •   
  • Primitive value直接存储在变量访问的位置。
  •   
  • Reference values对象,存储在中。
  •   存储在变量位置的
  • Reference value是指向存储对象的内存中的位置的指针。
  •   
  • 原始类型包括UndefinedNullBooleanNumberString
  •   
     

基础知识

     

对象是属性的聚合。房产可以参考   objectprimitivePrimitives are values,他们没有   属性。

     

JavaScript有5种原始数据类型:字符串, 数字,   布尔 null 未定义。除了null和undefined之外,所有基元值都具有包装的对象等价物   围绕原始值,例如一个 String 对象包裹着一个   字符串原语。所有原语都是不可变的。

答案 1 :(得分:0)

实际上,您只将范围属性绑定到视图,然后使用服务属性值初始化这些属性。 您的代码包含一些编辑内容:

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

myApp.service('s1', function() {
    this.Input = {
        name: 'John'
    };

    this.name = 'Doe';
});

myApp.controller('c1', function($scope, s1) {
    $scope.Input = s1.Input;
    $scope.name = s1.name;
});

myApp.controller('c2', function($scope, s1) {
    $scope.Input = s1.Input;
    $scope.name = s1.name;

    $scope.change = function() {
        console.log("s1.name = "+s1.name);
        s1.name = "ciao";
        console.log("s1.name = "+s1.name);
    };
});

因此,如果更改c2控制器的$ scope.name值(例如,在视图中编辑输入框),该值不会传播到s1.name。 此外,如果更改s1.name属性(请参阅c2控制器中的$ scope.change方法),则此修改不会传播到$ scope.name。

传播服务属性中的更改的方法是使用事件,即来自服务的上升事件以及侦听控制器中的相同事件(请参阅How do I create a custom event in an AngularJs service)。

以下是更新的jsfiddle:http://jsfiddle.net/0j0mdjco/2/