2014-02-26 49 views
0

我已经在控制器内部创建了一个名为Call的工厂我在$ scope中有一个Calls数组。我想要做的是更新Call对象并更新$ scope。我已经尝试过使用$,但是我无法完成它的工作,即使可以,它也有点过分了......

当工厂对象被修改时,如何更新$ scope ?

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

ctiApp.controller('PhoneController', function($scope,$interval,$http,Call,$rootScope){ 
    $scope.calls = [ 

    ]; 


    $scope.dial = function(number){ 
     var call = new Call(); 
     call.dial(number); 
     $scope.calls.push(call); 
    } 

}); 

// Factory 
ctiApp.factory('Call',['$rootScope','$http', function($rootScope ,$http){ 
    var Call = function() { 
     this.channel=''; 
     this.uid=''; 
     this.time='00:00:00'; 
     this.state='connecting'; 
     this.callerid=''; 
    } 

    Call.prototype.dial = function(number){ 
     $http({method: 'GET', url: '/url'}). 
      success(function(data, status, headers, config) { 
       if(data.data.response==='Success'){ 
        console.log('#CONNECTED'); 
        this.state = 'connected'; 
        this.time = '00:00:00'; 
        this.uid = data.data.uniqueid; 
        this.channel = data.data.channel; 
        this.callerid = number; 
       } 
      }); 
    } 
    return Call; 
}]); 

注:我已经拆出来的大部分功能了这些功能,这就是为什么有一些$ HTTP,$间隔等,仍落后....

回答

0

的解决方案是实际上比它在表面上看起来要简单得多。我最初更新错了,并且不需要使用像服务($ emit,$ broadcast,$ on等)的触发器来传播更改。

该函数原本不工作的原因是因为这。 。不再指Call对象,但到了$ HTTP动词它在使用

所以修改函数如下所示:

Call.prototype.dial = function(number){ 
    var self=this;//This is key! 
    $http({method: 'GET', url: '/url'}). 
     success(function(data, status, headers, config) { 
      if(data.data.response==='Success'){ 
       console.log('#CONNECTED'); 
       self.state = 'connected'; 
       self.time = '00:00:00'; 
       self.uid = data.data.uniqueid; 
       self.channel = data.data.channel; 
       self.callerid = number; 
      } 
     }); 
} 
0

宣布工厂将返回有道功能例如:

app.factory('testFactory', function(){ 
return { 
    sayHello: function(text){ 
     return "Factory says \"Hello " + text + "\""; 
    }, 
    sayGoodbye: function(text){ 
     return "Factory says \"Goodbye " + text + "\""; 
    } 
}    
}); 
+0

这就是我最初使用,但返回一个类而不是更容易。使用新关键字时未遇到问题。 – Mattisdada

1

我知道这是不是真正的问题,你有,但另一种方式创建一个类的多个实例(例如,您的电话类)是使用$控制器服务。这个方法在Writing a Massive Angular App at Google NG Conf对话中被推荐。

下面是一个例子:

HTML:

<div ng-app="myApp" ng-controller="myCtrl as ctrl"> 
    instance1: {{ctrl.instance1}} 
    instance2: {{ctrl.instance2}} 
</div> 

JS:

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

myApp.controller('Foo', function() { 
    var Foo = function($log) { 
     this.$log = $log; 
     this.sampleField = 1; 
    } 

    Foo.prototype.increaseSampleField = function() { 
     this.sampleField++; 
     this.$log.info('sample field is now: ' + this.sampleField);    
    }; 

    return Foo; 
}()); 

var myCtrl = function($controller) { 
    this.instance1 = $controller('Foo'); 
    this.instance2 = $controller('Foo'); 
    this.instance2.increaseSampleField(); 
} 

而这里的jsfiddle:http://jsfiddle.net/robianmcd/M2Phe/