2014-06-14 58 views
0

我有下面的代碼片斷:通過jQuery的回調修改範圍可變

$scope.addName = (name) -> 
    $scope.names.push name 
    $(".names").draggable 
    helper: "clone" 
    revert: true 
    $(".name-list").droppable 
    accept: ".names" 
    activate: -> 
     $(@).addClass "bordered" 
    deactivate: -> 
     $(@).removeClass "bordered" 
    drop: (e, ui) -> 
     name = ui.draggable.attr "data-names-name" 
     $scope.addName name 

在這裏,用戶拖動名(表示)作爲名稱列表上的div,然後拖動的名稱被添加到名稱數組。

問題在於,名稱數組在向其中推入新名稱後仍爲空。

+0

混合角和jQuery一般禁忌。你應該可以通過指令來做到這一點(並且我是積極的,你可以單獨使用角度來做)。 – jcollum

回答

0

只要腳本在角度上下文之外執行,就需要手動讓角度知道觸發摘要循環並更新視圖。

在腳本中,你應該能夠做到以下幾點:

drop: (e, ui) ... 

$(e).scope().$digest(); 

我注意到,$範圍內已經可以再滴功能。再下面是更好:

$scope.$digest(); 
+0

$ scope。$ digest並不是一個安全的解決方案,因爲它可能會拋出一個'摘要已經在進行中'的錯誤,您應該重新考慮使用'$ scope。$ apply( - > * variables to apply on scope *)' – maurycy

+0

並不完全正確。 $ scope。$ apply和$ scope。$ digest之間沒有實質性的區別,只是$ scope。$ apply讓你有機會在調用$ digest之前執行代碼。無論您使用$ apply還是$ digest,與是否更有可能拋出「摘要已在進行中」錯誤無關。 – pixelbits

+0

你是錯誤的@pixelbits:'通常,你不直接在控制器或指令中調用$ digest()。相反,你應該調用$ apply()(通常來自一個指令內),這將直接從angularjs文檔和$ scope中直接獲取$ digest()。$ digest直接與'摘要已經在進行中'錯誤 – maurycy

1

把它包在$範圍$申請(對不起,不使用CofeeScript)

.. 
$scope.$apply(function(){ 
    $scope.addName(name); 
});