2013-12-18 69 views
3

我有一個角指令使用=操作者雙向結合的分離的範圍與其父範圍的屬性:從分離的範圍內刪除一個引用的範圍對象 - angular.js

app.directive('nestedDirective', function(){ 
    return { 
     scope: { 
      model: '=' 
     }, 
     link: function($scope){ 
      ... 
     } 
    } 
}); 

我理解對$ scope.model的任何更改都會傳播到父範圍。但是,刪除$ scope.model不會傳播。 delete($scope.model)因此,我的問題是:如何刪除引用的變量並將刪除傳播到父範圍。

This codepen應該說明什麼,我試圖做沒有(甚至沒有看範圍觸發事件)

+0

「但是,刪除$ scope.model不會傳播」。 如何刪除'$ scope.model'? – Neozaru

+0

刪除($ scope.model),我很想知道一個更好的方法。你可以在codepen中看到它:http://codepen.io/goodafternoon/pen/rneKa – nimrod

+0

也許你正在刪除「$ scope.model」結構,但是這個結構沒有指向值。 Try $ scope.model = null – Neozaru

回答

2

這個問題被問得不得了的時候,所以我會參照wiki article開始。

基本上遵循「點法則」:如果需要修改屬性(直接),範圍以另一個屬性,以便JS原型繼承可以踢:

var model = {prop: "val"}; 
var a = {model: model}; 

model = null; 
console.log(a.model.prop); // prints val 

var b = {a: a}; 
a.model = null; 

console.log(b.a.model); // prints null 

這是這裏的相同(即使這不使用原型繼承來簡化事情)。

+0

這不完全相同,如果你看看我提到的codepen: http://codepen.io/goodafternoon/pen/rneKa你可以看到我試圖刪除的項目是父範圍內的一個數組的一部分,也是在角度上創建隔離範圍的全部要點是將它們隔離開來,上升原型鏈失敗的目的。 – nimrod

+0

你不能解除你沒有控制權的東西。只需命名空間模型並將其隔離即可。 – Ven

1

我已經編輯下面的代碼筆源,我敢肯定有這樣做的一個簡單的方法,但我只是想這和它的作品,它應該開始你在正確的道路上:

<ul ng-app="app" ng-controller="ctrl"> 
    <dir model="data.children" child="child" ng-repeat="child in data.children"></dir> 
</ul> 

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

app.controller('ctrl', function($scope){ 
    $scope.data = {}; 
    $scope.data.children = [ 
    {name: 'Ben'}, 
    {name: 'Heffler'}, 
    {name: 'Schubert'} 
    ]; 

    $scope.$watchCollection('data.children', function(){ 
    console.log("children shallow watch", $scope); 
    }); 
    $scope.$watch('data.children', function(){ 
    console.log("children deep watch",$scope); 
    }, true); 
}); 

app.directive('dir', function(){ 
    return { 
    restrict: 'E', 
    scope: { 
     model: '=', 
     child:'=' 
    }, 
    replace: true, 
    template: '<div>{{child.name}} <button ng-click="remove()">Remove</button></div>', 
    link: function(scope, element, attrs){ 
     scope.remove = function(){ 
     // I'm just deleting the first one as an example. 
     delete(scope.model[0]); 
     console.log("children inner scope", scope) 
     } 
    } 
    }; 
}); 

我不確定你爲什麼要刪除這些屬性,但我相信你有你的理由,只是爲了向你展示它是可能的。

EDIT

這裏是編輯的代碼筆(參見控制檯日誌,以查看在範圍已刪除項目)。 http://cdpn.io/Ghmvk