我刚开始使用ngJS。
我找到了将服务objects
绑定到控制器的方法。
我想知道,这是实现这一目标的好方法,还是有推荐的方法来做到这一点?
我还想知道为什么这只能在objects
而不是properties
上实现?
这是我的fiddle。 深入解释是受欢迎的。
感谢。
答案 0 :(得分:1)
阅读此SO thread。
variable
可以包含两种类型的值之一:primitive values and reference values
。
Primitive values
是存储在堆栈上的数据。Primitive value
直接存储在变量访问的位置。- 存储在变量位置的
Reference values
是对象,存储在堆中。Reference value
是指向存储对象的内存中的位置的指针。- 原始类型包括
Undefined
,Null
,Boolean
,Number
或String
。基础知识
对象是属性的聚合。房产可以参考
object
或primitive
。Primitives 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/